【问题标题】:LabelFor not working in loop (for/foreach/template)LabelFor 不能循环工作(for/foreach/template)
【发布时间】:2012-02-20 09:49:45
【问题描述】:

我正在尝试制作一个复选框列表,但 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>

如您所见,&lt;label&gt; 未按预期工作。

【问题讨论】:

  • 我想我已经把它缩小到 EditorFor() 没有生成一个 id 属性,所以 LabelFor() 没有什么可附加的。

标签: asp.net-mvc-3


【解决方案1】:

问题是,由于在您的主视图中您直接拥有IEnumerable&lt;MyViewModel&gt;,前缀是[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.EditorForModel(),而不是@Html.DisplayFor(x =&gt; Model)

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

公共类 MyViewModel { 公共 IEnumerable 项目 { 获取;放; } }

ItemViewModel:

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>

现在它将按预期工作。

【讨论】:

  • 这看起来很有趣,我试试看:)
  • 有效!非常感谢。我最终在模型中使用了带有可枚举的示例,因为它似乎是更可靠的解决方案。
  • @Darin Dimitrov .. 我还在以下链接 (stackoverflow.com/questions/6703353/…) 上看到了相同的显示目的。我只是有一个问题,cshtml 的名称应该是什么? (它是否与模型名称或其他名称相同)。
【解决方案2】:

你为什么使用模型。选择在

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

下面的代码不能工作吗?

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

【讨论】:

  • 它没有 :( LabelFor 怎么知道要附加到什么?我相信我必须在编辑器和标签中使用相同的属性才能链接它。
  • 您是否尝试过在视图中使用 foreach? @foreach(模型中的模型){@Html.DisplayFor(model)}
  • 这实际上有点工作。但后来我失去了元素的唯一名称。因此,我得到的不是 name="[#].Selected",而是 name="Selected"。这是我发布时的问题。
【解决方案3】:

把foreach写成

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

然后就可以这样绑定了

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

你应该可以发布这个了。

【讨论】:

    【解决方案4】:

    感谢达林·迪米特洛夫。

    还要补充一点:

    名称必须以无法识别为模型的其他方式匹配。 (对于这个例子是 mySkills)

    ViewData.TemplateInfo.HtmlFieldPrefix = "mySkills" + ViewData.TemplateInfo.HtmlFieldPrefix;...

    public ActionResult Create(List mySkills ...

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多