Ярлык для бритвы

Вопрос:

Я использую MVC5 с EF6. У меня было требование создать несколько десятков списков раскрывающегося списка в представлении, которое содержит выбираемые пользователем настройки, которые затем используются во всем веб-приложении.

Проблема, с которой я столкнулась, – это ошибка на линиях LabelFor и DropdownListFor в бритве. Вид:

Сообщение об ошибке компилятора: CS0411: аргументы типа для метода ‘System.Web.Mvc.Html.LabelExtensions.LabelFor System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>, string)’ не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

Я проследил мой код, чтобы убедиться, что Model.Preferences содержит данные, которые я намеревался, и это так. На самом деле, он отлично работает с Html.Label и Html.DropdownList, но я не мог заставить выбранный элемент работать таким образом, поэтому я переключился на DropdownListFor так как мне было легче работать с этим.

Вот фрагменты моего кода (работа продолжается):

Простой класс для хранения IEnumerable из SelectListItem:

public class Preference
{
public string ControlType;          // "Select", "Textbox"
public string Label;                // Label of control
public IEnumerable<SelectListItem> ListItems;
}

MODEL (IEnumerable of Preference дает мне “Настройки”)

public class UserPreferencesViewModel
{
public IEnumerable<Preference> Preferences { get; set; }
}

КОНТРОЛЛЕР

List<Preference> Preferences = new List<Preference>();

foreach (var g in uomGroups)
{
List<SelectListItem> listitems = new List<SelectListItem>();

foreach (var w in g.Options)
{
... Omitted for brevity ...

listitems.Add( new SelectListItem { Text = w.UOMId, Value = w.UOMId, Selected = isSelected } )
}

var p = g.Options.ToArray();
Preferences.Add( new Preference
{
ControlType = "Select",
Label = g.Preference,
ListItems = listitems
});
}

model.Preferences = Preferences.AsEnumerable();

return View(model);

ПОСМОТРЕТЬ

<tbody>
@foreach (Preference preference in Model.Preferences)
{
<tr>
<td>
@Html.LabelFor(
x => x.Label,
new { @class = "col-md-3 control-label" }
)
</td>

<td>
@Html.DropDownListFor(
x => x.Label,
new SelectList(preference.ListItems, "Value", "Text"),
new { @class = "col-md-3 form-control" }
)
</td>
</tr>
}
</tbody>

Из приведенного выше кода кто-нибудь видит, где проблема? Я пытался понять это часами и просто не вижу этого.

Лучший ответ:

Должен быть

@foreach (Preference preference in Model.Preferences)
{
  ...
  @Html.LabelFor(i => preference.Label, ...
  ...
  @Html.DropDownListFor(i => preference.Label, preference.ListItems, ...
  ...

РЕДАКТИРОВАТЬ

если вам нужны уникальные идентификаторы и имена, тогда он должен быть циклом for чтобы они были правильно проиндексированы

@for (int i = 0; i < Model.Preferences.Count; i++)
{
  ...
  @Html.LabelFor(i => Model.Preferences[i].Label, ...
  ...
  @Html.DropDownListFor(i => Model.Preferences[i].Label, preference.ListItems, ..
  ...

это сделает html как

<select id = "Preferences_1__Label" name="Preferences[1].Label" ...
<select id = "Preferences_2__Label" name="Preferences[2].Label" ...

Оцените статью
TechArks.Ru
Добавить комментарий