Razor LabelFor和DropdownFor

时间:2014-07-22 23:16:31

标签: asp.net-mvc linq razor

我正在使用MVC5和EF6。我需要在视图中创建几十个下拉列表,其中包含随后在整个Web应用程序中使用的用户可选择的首选项。

我遇到的问题是剃刀视图中的LabelFor和DropdownListFor行都出错:

  

编译器错误消息:CS0411:方法的类型参数' System.Web.Mvc.Html.LabelExtensions.LabelFor System.Web.Mvc.HtmlHelper,System.Linq.Expressions.Expression>,string)&# 39;无法从使用中推断出来。尝试明确指定类型参数。

我已经通过我的代码进行了跟踪,以确保Model.Preferences包含我想要的数据,确实如此。实际上,它适用于Html.LabelHtml.DropdownList,但我无法通过这种方式使所选项目正常工作,所以我切换到DropdownListFor,因为我找到了在这方面更容易合作。

以下是我的代码片段(正在进行的工作):

一个包含IEnumerable的SelectListItem的简单类:

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

模型(一个IEnumerable of Preference给我&#39;偏好&#39;)

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

CONTROLLER

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>

从上面的代码中,有人看到问题所在吗?我一直试图弄清楚这几个小时,只是没有看到它。

1 个答案:

答案 0 :(得分:1)

应该是

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

修改

如果您需要唯一的ID和名称,那么它需要是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" ...