我正在尝试列出复选框,但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)
现在它将按预期工作.
| 归档时间: |
|
| 查看次数: |
2680 次 |
| 最近记录: |