我正在尝试列出复选框,但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>
无效。
答案 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)
还要补充一点:
名称必须以其他方式匹配,否则它不会将其识别为模型。 (对于这个例子,mySkills)
ViewData.TemplateInfo.HtmlFieldPrefix =“ mySkills ”+ ViewData.TemplateInfo.HtmlFieldPrefix; ...
公共ActionResult创建(列出 mySkills ...