gpt4 book ai didi

asp.net-mvc-3 - LabelFor 不在循环中工作(for/foreach/template)

转载 作者:行者123 更新时间:2023-12-02 03:55:18 26 4
gpt4 key购买 nike

我正在尝试制作一个复选框列表,但 Html.LabelFor 不起作用。它不断生成<label for="">Some text</label> ,注意空For属性。

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

模型:

public class MyViewModel
{
public string Name { get; set; }
public bool Selected { get; set; }
}

Controller :

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

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

return View(model);
}

View :

@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>没有按预期工作。

最佳答案

问题是,因为在你的主视图中你直接有 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() .

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

公共(public)类MyViewModel{ 公共(public) IEnumerable 项目 { get;放; }}

哪里ItemViewModel :

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

然后是你的 Controller :

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

在 View 中:

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

现在它将按预期工作。

关于asp.net-mvc-3 - LabelFor 不在循环中工作(for/foreach/template),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359089/

26 4 0