Asp.net mvc 如何以最优雅的方式实现MVC4中对象列表的编辑视图?
我有一个“ContactInfo”视图,我想从用户那里获得不同类型的不同电话号码列表。用户应该能够添加、编辑和删除数字,并指定其类型。至少需要一个手机号码 我尝试过不同的方法,但在某个时候我已经走到了死胡同。我认为描述整个场景并寻求解决方案比询问特定的bug更有效。我很感谢你的回答 这是我的手机课程:Asp.net mvc 如何以最优雅的方式实现MVC4中对象列表的编辑视图?,asp.net-mvc,razor,Asp.net Mvc,Razor,我有一个“ContactInfo”视图,我想从用户那里获得不同类型的不同电话号码列表。用户应该能够添加、编辑和删除数字,并指定其类型。至少需要一个手机号码 我尝试过不同的方法,但在某个时候我已经走到了死胡同。我认为描述整个场景并寻求解决方案比询问特定的bug更有效。我很感谢你的回答 这是我的手机课程: public partial class Phone { public int Id { get; set; } public int UserId { get; set; }
public partial class Phone
{
public int Id { get; set; }
public int UserId { get; set; }
public string Number { get; set; }
public PhoneNumberType Type { get; set; }
public virtual User User { get; set; }
}
这是电话类型枚举:
public enum PhoneNumberType
{
None,
Mobile,
Home,
Work
}
这是视图的模型(我还包括了一个列表,该列表从枚举填充电话类型,以填充类型组合框):
公共类ContactInfoModel
{
公共int Id{get;set;}
公共字符串电子邮件地址{get;set;}
公共字符串国家{get;set;}
公共字符串省{get;set;}
公共字符串country{get;set;}
公共字符串City{get;set;}
公共字符串地址{get;set;}
公共i收集电话{get;set;}
私有IEnumerable\u电话类型;
公共IEnumerable电话类型
{
得到
{
if(this.\u phoneTypes==null)
{
_phoneTypes=EnumUtility.GetEnumMembers(typeof(PhoneNumberType));
}
返回电话类型;
}
}
}
最后,这是一种观点:
@model Jobeteria.Models.JobSeekers.ContactInfoModel
@{ViewBag.Title = "Contact Information";}
@using (Html.BeginForm()){
@Html.AntiForgeryToken()
<header class="pages-header">
<div class="pages-header-bg text-background"></div>
<hgroup>
<h1>@ViewBag.Title</h1>
</hgroup>
</header>
<div class="pages-wide-column">
<div class="pages-body-bg text-background"></div>
<div class="pages-content-marginer">
<fieldset>
<legend>Contact Information</legend>
<ol>
<li>
@*view to manipulate phone numbers*@
</li>
<li>
@Html.LabelFor(model => model.EmailAddress)
@Html.EditorFor(model => model.EmailAddress)
<br/>
@Html.ValidationMessageFor(model => model.EmailAddress)
</li>
<li>
@Html.LabelFor(model => model.Country)
@Html.EditorFor(model => model.Country)
<br/>
@Html.ValidationMessageFor(model => model.Country)
</li>
<li>
@Html.LabelFor(model => model.Province)
@Html.EditorFor(model => model.Province)
<br/>
@Html.ValidationMessageFor(model => model.Province)
</li>
<li>
@Html.LabelFor(model => model.County)
@Html.EditorFor(model => model.County)
<br/>
@Html.ValidationMessageFor(model => model.County)
</li>
<li>
@Html.LabelFor(model => model.City)
@Html.EditorFor(model => model.City)
<br/>
@Html.ValidationMessageFor(model => model.City)
</li>
<li>
@Html.LabelFor(model => model.Address)
@Html.TextAreaFor(model => model.Address)
<br/>
@Html.ValidationMessageFor(model => model.Address)
</li>
<li class="horizontal-field">
<input type="submit" value="SAVE" />
<input type="reset" value="Cancel" onclick="javascript: history.back(1);"/>
</li>
</ol>
</fieldset>
</div>
</div>}
@model jobetia.Models.jobseers.ContactInfoModel
@{ViewBag.Title=“联系信息”;}
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@视图包。标题
联系方式
@*查看以操纵电话号码*@
@LabelFor(model=>model.EmailAddress)
@EditorFor(model=>model.EmailAddress)
@Html.ValidationMessageFor(model=>model.EmailAddress)
@LabelFor(model=>model.Country)
@EditorFor(model=>model.Country)
@Html.ValidationMessageFor(model=>model.Country)
@LabelFor(model=>model.Province)
@EditorFor(model=>model.Province)
@Html.ValidationMessageFor(model=>model.Province)
@LabelFor(model=>model.country)
@EditorFor(model=>model.country)
@Html.ValidationMessageFor(model=>model.County)
@LabelFor(model=>model.City)
@EditorFor(model=>model.City)
@Html.ValidationMessageFor(model=>model.City)
@LabelFor(model=>model.Address)
@Html.TextAreaFor(model=>model.Address)
@Html.ValidationMessageFor(model=>model.Address)
}
我总是觉得模型绑定到可枚举项有点痛苦-这基本上就是您试图实现的,允许用户编辑电话号码列表
在验证方面,我将编写一个自定义验证属性以在视图模型中使用-这将检查是否至少存在一个电话号码
Phil Haack在博客中发布了关于绑定列表的内容:
根据Phil的帖子改编,我认为你必须这样做:
<% for (int i = 0; i < userPhoneNumeberCount; i++) { %>
<%: Html.TextBoxFor(m => m.Phones[i].Number ) %>
<%: Html.SelectListFor(m => m.Phones[i].Type, PhoneNumberSelectListData ) %>
<% } %>
m、 电话[i].号码)%>
m、 电话[i]。类型,电话号码选择列表数据)%>
Phil Haack在1902年写下了这段代码,我一直在这段代码上磕磕绊绊。MVC5
<% for (int i = 0; i < userPhoneNumeberCount; i++) { %>
<%: Html.TextBoxFor(m => m.Phones[i].Number ) %>
<%: Html.SelectListFor(m => m.Phones[i].Type, PhoneNumberSelectListData ) %>
<% } %>