Label不在循环中工作(for/foreach/template)

Snæ*_*ørn 4 asp.net-mvc-3

我正在尝试列出复选框,但Html.LabelFor无效.它不断生成<label for="">Some text</label>,请注意空For属性.

在尝试使用显示模板之前,我尝试过for和foreach循环,但它们都有这个问题.我拒绝相信手动编写输入字段是唯一的解决方案.所有的帮助/提示非常感谢.

该模型:

public class MyViewModel
{
    public string Name { get; set; }
    public bool Selected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制者:

public ActionResult MyController()
{
    var model = new List<MyViewModel>();

    model.Add(new MyViewModel() { Name= "Foo" });
    model.Add(new MyViewModel() { Name= "Bar" });

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

风景:

@model IEnumerable<MyViewModel>
<div>
    @Html.DisplayFor(x => Model)
</div>
Run Code Online (Sandbox Code Playgroud)

显示模板:

@model MyViewModel
<p>
    @Html.LabelFor(model => model.Selected, Model.Name)
    @Html.EditorFor(model => model.Selected)
</p>
Run Code Online (Sandbox Code Playgroud)

结果:

<div>    
    <p>
        <label for="">Foo</label>
        <input class="check-box" data-val="true" data-val-required="The Foo field is required." 
            name="[0].Selected" type="checkbox" value="true" />
        <input name="[0].Selected" type="hidden" value="false" />
    </p>
    <p>
        <label for="">Bar</label>
        <input class="check-box" data-val="true" data-val-required="The Bar field is required." 
            name="[1].Selected" type="checkbox" value="true" />
        <input name="[1].Selected" type="hidden" value="false" />
    </p>
<div>
Run Code Online (Sandbox Code Playgroud)

如你所见,<label>它没有按预期工作.

Dar*_*rov 10

问题是,因为在您的主视图中,您直接拥有IEnumerable<MyViewModel>,前缀是[0].Selected帮助者不喜欢的.您还会注意到您的复选框没有ID.这是一个你可以用来改变这个前缀的黑客:

@model MyViewModel
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "Model" + ViewData.TemplateInfo.HtmlFieldPrefix;
}

<p>
    @Html.LabelFor(model => model.Selected, Model.Name)
    @Html.EditorFor(model => model.Selected)
</p>
Run Code Online (Sandbox Code Playgroud)

显然这假设你的POST动作参数被调用model:

[HttpPost]
public ActionResult Index(IEnumerable<MyViewModel> model) { ... }
Run Code Online (Sandbox Code Playgroud)

情况可能并非总是如此.

另请注意,@Html.DisplayFor(x => Model)您可以使用而不是在主视图中@Html.EditorForModel().

另一种可能性是将它包装在具有集合属性的视图模型中:

public class MyViewModel {public IEnumerable Items {get; 组; }}

其中ItemViewModel:

public class ItemViewModel
{
    public string Name { get; set; }
    public bool Selected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你的控制器:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        Items = new[]
        {
            new ItemViewModel() { Name= "Foo" },
            new ItemViewModel() { Name= "Bar" }
        }
    };
    return View(model);
}

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在视图中:

@model MyViewModel
<div>
    @using (Html.BeginForm())
    {
        @Html.DisplayFor(x => x.Items)
        <button type="submit">OK</button>
    }
</div>
Run Code Online (Sandbox Code Playgroud)

并在编辑器模板(~/Views/Shared/EditorTemplates/ItemViewModel.cshtml)中:

@model ItemViewModel
<p>
    @Html.LabelFor(model => model.Selected, Model.Name)
    @Html.EditorFor(model => model.Selected)
</p>
Run Code Online (Sandbox Code Playgroud)

现在它将按预期工作.