Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4 ASP.NET MVC 3如何在创建视图上为具有ICollection属性的模型提供多字段创建功能_Entity Framework 4_Asp.net Mvc 3_Ef Code First - Fatal编程技术网

Entity framework 4 ASP.NET MVC 3如何在创建视图上为具有ICollection属性的模型提供多字段创建功能

Entity 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;

注意:我正在使用MVC3+Razor、EF4、CF-CTP5

  • 如何使视图能够在客户机上为每个组织动态添加多个地址类,并与post上的模型紧密绑定

  • 如果(ModelState.IsValid==false)输入3个地址并发布一个无效的模型,它将用相应的值重新填充数字地址,那么如何在模型中使用视图解析值

  • 以下是我的模型:

    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)