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

asp.net-mvc-3 – ASP.NET MVC 3编辑器模板中的IEnumerable模型

发布时间:2020-12-16 09:44:53 所属栏目:asp.Net 来源:网络整理
导读:我有一个具有IEnumerable属性的模型(警告伪代码可以遵循) public class PersonModel { public string Name { get; set; } public IEnumerableAddressModel Addresses { get; set; }}public class AddressModel { public string Name { get; set; }} 我想在同
我有一个具有IEnumerable属性的模型(警告伪代码可以遵循)

public class PersonModel {
    public string Name { get; set; }
    public IEnumerable<AddressModel> Addresses { get; set; }
}

public class AddressModel {
    public string Name { get; set; }
}

我想在同一视图中显示Address子对象

Person.cshtml

@model PersonModel

<form>
    <h2>Person</h2>

    @Html.EditorFor(m=>m.Name)

    <ul>@Html.EditorFor(m=>m.Addresses)</ul>

</form>

EditorTemplate / AddressModel

@model AddressModel

<li>@Html.TextboxFor(m=>m.Name)</li>

奇妙,一切正常

但是,作为一个git,我现在想开始使用模板布局以标准类型的方式包装我的所有属性

所以我创建了一个string.cshtml和一个list.cshtml来做这个,使用_Control.cshtml进行布局

EditorTemplates / _Control.cshtml

<div>
    @Html.Label(string.Empty)
    <div class="input">
        @RenderBody()                    

        @Html.ValidationMessage(string.Empty)
    </div>
</div>

EditorTemplates / string.cshtml

@model string
@{    
    Layout = "_Control.cshtml";
}
@Html.TextBox(string.Empty,Model)

(到目前为止耶!但等等……哦不..)

这是麻烦

<ul>@Html.EditorFor(m=>m.Addresses)</ul>

从主视图(见上文)变成

@Html.EditorFor(m=>m.Addresses,"List")

EditorTemplates / list.cshtml

@model IEnumerable<object>
@{    
    Layout = "_Control.cshtml";
}
<ul>
    @foreach(var item in Model){
        @Html.EditorFor(m => item)
    }
</ul>

这会错误地呈现id和名称,例如Addresses_item_Name,它不包含Id,因此使用for循环添加id

@for (var i = 0; i < Model.Count();i++ ) {
    @Html.EditorFor(m => Model.ElementAt(i))
}

这会爆发,因为MVC表达式助手除了数组之外不允许任何其他内容,但是地址必须是IEnumerable<>因为EF4.1在子查询中不支持.ToArray,即.

var model = (from p in DataContext.People
             where p.Id = 1
             select new PersonModel {
                 Name = p.Name,Addresses = (from a in p.Addresses
                              select new AddressModel {
                                  Name = a.Name 
                              }).ToArray() // **NOT SUPPORTED**
             }).FirstOrDefault();

有没有人反对这个?
有标准方法吗?

这有效,但是对吗?

EditorTemplates / list.cshtml

@model IEnumerable<object>
@{    
    Layout = "_Control.cshtml";
    var prefix = ViewData.TemplateInfo.HtmlFieldPrefix;
}
<ul>
    @for (var i = 0; i < Model.Count();i++ ) {
        var item = Model.ElementAt(i);
        ViewData.TemplateInfo.HtmlFieldPrefix = string.Format("{0}[{1}]",prefix,i);
        @Html.EditorFor(m => item,null,string.Empty)
    }
</ul>

所需的结构是

<form>
    <control>
       Person Name Control Elements
    <control>

    <control>
       Address List Control Elements
    <control>
</form>

解决方法

EditorFor不允许任何put属性类型,而不是方法,这将是它死亡的原因.

我的建议是将模板创建为单个地址项,然后使用外部循环编辑每个模板,或使用为您执行此操作的editorformodel.

(编辑:李大同)

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

    推荐文章
      热点阅读