加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:28:01 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试列出复选框,但 Html.LabelFor无效. 它不断生成 label for =“”某些文字 / label,请注意空的For属性. 在尝试使用显示模板之前,我尝试过for和foreach循环,但它们都有这个问题. 我拒绝相信手动编写输入字段是唯一的解决方案. 所有的帮助/提示非常感
我正在尝试列出复选框,但 Html.LabelFor无效.
它不断生成< label for =“”>某些文字< / 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>没有按预期工作.

解决方法

问题是因为在你的主视图中你直接拥有IEnumerable< MyViewModel>,前缀是[0].选择了帮助者不喜欢的.您还会注意到您的复选框没有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动作参数被称为模型:

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

情况可能并非总是如此.

另请注意,您可以使用@ Html.EditorForModel()代替主视图中的@ Html.DisplayFor(x => Model).

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

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

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

现在它将按预期工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读