Entity framework 4 ASP.NET MVC 3如何在创建视图上为具有ICollection属性的模型提供多字段创建功能
注意:我正在使用MVC3+Razor、EF4、CF-CTP5Entity framework 4 ASP.NET MVC 3如何在创建视图上为具有ICollection属性的模型提供多字段创建功能,entity-framework-4,asp.net-mvc-3,ef-code-first,Entity Framework 4,Asp.net Mvc 3,Ef Code First,注意:我正在使用MVC3+Razor、EF4、CF-CTP5 如何使视图能够在客户机上为每个组织动态添加多个地址类,并与post上的模型紧密绑定 如果(ModelState.IsValid==false)输入3个地址并发布一个无效的模型,它将用相应的值重新填充数字地址,那么如何在模型中使用视图解析值 以下是我的模型: public class Organization { public int Id { get; set; } public string Name { get;
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; }
...
}
public class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public int Type { get; set; }
}
你的问题太多了:) 这只是实现你的要求的方法之一,我相信有比我更好的方法 我将从你的第二个问题开始: 如何让视图解析值 在模型中,如果 (ModelState.IsValid==false)这样 如果你输入3个地址并发布 如果模型无效,它将重新填充 编号地址及其地址 适当的价值观 如果我正确理解你的要求,我觉得这很简单。答案很简单,对视图进行编码,以呈现模型类内容,并将无效模型返回给客户端,就像您在
创建
操作中所做的那样
如果您的表单(及其字段)已使用ValidationSummary/ValidationMessage
html帮助程序进行了修饰,您还将看到验证消息
组织类使用以下代码段
@using (Html.BeginForm()) {
@Html.HiddenFor(o => o.Id)
@Html.ValidationSummary( true )
<fieldset>
<legend>My Organization</legend>
<div class="editor-label">@Html.LabelFor( model => model.Name )</div>
<div class="editor-field">
@Html.EditorFor( model => model.Name )
@Html.ValidationMessageFor( model => model.Name )
</div>
<br />
<div id="container">
<div>Address List</div>
@foreach (Address a in Model.Addresses ) {
Html.EditorFor(a);
}
</div>
<div style="text-align:right;margin-top:14px;">
<input type="submit" id="btnSubmit" value="Save" />
</div>
</fieldset>
}
@使用(Html.BeginForm()){
@HiddenFor(o=>o.Id)
@Html.ValidationSummary(true)
我的组织
@LabelFor(model=>model.Name)
@EditorFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
地址表
@foreach(Model.Addresses中的地址a){
Html.EditorFor(a);
}
}
要自动绑定,表单的结果代码应如下所示
<form action="..." id="..." method="post">
<input type="hidden" name="Id" value="2">
<input type="hidden" name="Name" value="Acme Corporation">
<!-- markup for each address -->
<input type="hidden" name="Addresses[0].Id" value="1">
<input type="hidden" name="Addresses[0].Line1" value="Line 1">
<input type="hidden" name="Addresses[0].Line2" value="Line 2">
... and so on...
</form>
... 等等
将其属性命名为地址[index].PropertyName
。
如果在客户机上添加新地址,这并不重要:只要代码遵守此规则,就可以让默认的模型绑定器为您完成这项工作
希望这有帮助我不确定是否正确理解了您的问题,但关于问题1,我认为您正在寻找ViewModel。也许像这样
OrganizationViewModel.cs
public class OrganizationViewModel
{
public OrganizationViewModel(Organization org, IList<Address> addresses)
{
this.Organization = org;
this.Addresses = addresses
}
public Organization Organization {get;set;}
public IList<Address> Addresses {get;set;}
}
Item.cshtml
@model OrganizationViewModel
<h1>@Model.Organization.Name</h1>
<ul>
@foreach(var a in Model.Addresses)
{
<li>@a.Line1</li>
<li>@a.Line2</li>}
</ul>
@model组织视图模型
@Model.Organization.Name
@foreach(Model.Addresses中的变量a)
{
- @a、 第1行
- @a、 第2行
}
在我尝试回答第2个问题之前,也许你应该指出我是否正确理解了问题1。希望这有帮助。我使用LINQ to SQL成功地做到了这一点。现在我尝试使用实体框架,但它确实使一切变得更加复杂。所以我没有一个解决方案给你,但我的L2S解决方案可能会有所帮助
使用从我的数据库生成的模型,我可以在我的视图中执行以下操作:
@for (int i = 0; i < Model.Contact.EmailAddresses.Count; ++i)
{
<li>
@Html.TextBoxFor(x => x.Contact.EmailAddresses[i].EmailAddress)
@Html.HiddenFor(x => x.Contact.EmailAddresses[i].EmailAddressID)
</li>
}
这工作得很好,在我的控制器操作中,我得到了联系人对象的Contact.ContactEmailAddresses列表,正如我预期的那样
但是使用EF,我不能再使用从数据库生成的EmailAddresses属性上的[I]。我想到的最好的办法是:
@Html.TextBox("Contact.EmailAddresses[" + i + "].EmailAddress", Model.Contact.EmailAddresses.ElementAt(i).EmailAddress)
@for (int i = 0; i < Model.Contact.EmailAddresses.Count; ++i)
{
<li>
@Html.TextBoxFor(x => x.Contact.EmailAddresses[i].EmailAddress)
@Html.HiddenFor(x => x.Contact.EmailAddresses[i].EmailAddressID)
</li>
}
class ContactViewModel
{
Contact contact { get; set; }
}
@Html.TextBox("Contact.EmailAddresses[" + i + "].EmailAddress", Model.Contact.EmailAddresses.ElementAt(i).EmailAddress)