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

时间:2012-02-20 09:49:45

标签: 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; }
}

控制器:

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

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

    return View(model);
}

视图:

@model IEnumerable<MyViewModel>
<div>
    @Html.DisplayFor(x => Model)
</div>

显示模板:

@model MyViewModel
<p>
    @Html.LabelFor(model => model.Selected, Model.Name)
    @Html.EditorFor(model => model.Selected)
</p>

结果:

<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>

正如您所看到的,<label>无效。

4 个答案:

答案 0 :(得分: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>

显然,这假设你的POST动作参数被称为model

[HttpPost]
public ActionResult Index(IEnumerable<MyViewModel> model) { ... }

可能并非总是如此。

另请注意,您可以使用@Html.DisplayFor(x => Model)代替@Html.EditorForModel(),而不是ItemViewModel

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

公共类MyViewModel {     public IEnumerable Items {get;组; } }

其中public class ItemViewModel { public string Name { get; set; } public bool Selected { get; set; } }

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)
{
    ...
}

然后你的控制器:

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

并在视图中:

~/Views/Shared/EditorTemplates/ItemViewModel.cshtml

并在编辑器模板(@model ItemViewModel <p> @Html.LabelFor(model => model.Selected, Model.Name) @Html.EditorFor(model => model.Selected) </p> )中:

{{1}}

现在它将按预期工作。

答案 1 :(得分:0)

为什么使用该模型。在

中选择
@Html.LabelFor(model => model.Selected, Model.Name)

不会低于代码工作吗?

  @Html.LabelFor(model => model.Name)

答案 2 :(得分:0)

将foreach写为

for (int i = 0; i < Model.Count; i++)

然后你可以像这样绑定

  Html.DisplayFor(model => model[i].Name)
  Html.EditorFor(model => model[i].Name)

你应该可以发布这个。

答案 3 :(得分:0)

感谢Darin Dimitrov。

还要补充一点:

名称必须以其他方式匹配,否则它不会将其识别为模型。 (对于这个例子,mySkills)

ViewData.TemplateInfo.HtmlFieldPrefix =“ mySkills ”+ ViewData.TemplateInfo.HtmlFieldPrefix; ...

公共ActionResult创建(列出 mySkills ...