Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.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
C# MVC下拉列表列出了复杂的父模型_C#_Jquery_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# MVC下拉列表列出了复杂的父模型

C# MVC下拉列表列出了复杂的父模型,c#,jquery,asp.net-mvc,entity-framework,C#,Jquery,Asp.net Mvc,Entity Framework,我猜我错过了一个简单的原则,有人会很快指出。我基本上有一个Person对象,它包含一些基本属性,然后是几个电话和地址列表。电话和地址都有一个类型(家庭/工作/等)。地址也有一个州和一个县 当我执行管理操作时,我正在为CountyId、StateProvinceID等设置ViewBag。但是当我有第二个地址或电话时,这些下拉列表似乎没有正确的选择值 我肯定这是我做错的最基本的事情 断然的。。。 我知道我缺少了一些基本的东西,答案就是简单地为地址和电话对象创建自定义视图模型。这些新视图模型可能包含每

我猜我错过了一个简单的原则,有人会很快指出。我基本上有一个Person对象,它包含一些基本属性,然后是几个电话和地址列表。电话和地址都有一个类型(家庭/工作/等)。地址也有一个州和一个县

当我执行管理操作时,我正在为CountyId、StateProvinceID等设置ViewBag。但是当我有第二个地址或电话时,这些下拉列表似乎没有正确的选择值

我肯定这是我做错的最基本的事情

断然的。。。 我知道我缺少了一些基本的东西,答案就是简单地为地址和电话对象创建自定义视图模型。这些新视图模型可能包含每个选择列表的列表

模型样品
你这里有很多错误,其中一些你还没有注意到。但你会的

首先,您不应该将dropdownlist的集合命名为与所选值相同的集合。MVC以一些不明显的方式使用
ViewBag
ViewState
,如果这样做,您会遇到很多麻烦。将项目列表更改为
StateProvinceList
CountyList
PhoneTypeList
AddressTypeList

第二件事是,您将无法将值正确地发布回控制器,因为您正在使用局部视图渲染集合的子项,并将该项作为模型传递给视图。MVC将基于模型的对象渲染为根对象,并创建名称(假设情况如此)。如果要将项目发布到接受父类的操作方法,则模型绑定器将无法正确绑定部分渲染值(因为MVC将其渲染为该子模型,而不是该子模型的集合)

相反,您应该使用EditorTemplate,它将完成几件事情。首先,EditorTemplate将自动迭代任何集合,然后使用考虑父类的专有名称呈现表单控件的名称

在此处阅读有关EditorTemplates的更多信息:

旁白:

为什么对StateProvince使用DropDownList,而对County和Address使用DropDownList?如果可以,请始终使用强类型版本,这有助于防止表单项命名错误


另一件事,为什么在构造函数中使用if块?根据定义,构造函数只有在构造对象时才会被调用,因此属性总是空的(好吧,有人可以从您的类派生并在子类构造函数中设置这些属性,但是如果是您的代码,您就会知道这一点)

尝试将部分视图放入shared/editortemplates文件夹,并使用html.editorfor(model=>model.address)

我应该在这些选择列表的地址和电话型号上添加属性吗?我突然意识到,这可以通过为电话和地址创建自定义视图模型来解决,每个视图模型都包含值的列表属性。。。相当愚蠢的小姐:)我想你在这里发现了一些东西。。。它仍然不一定能解决我在下拉列表中自定义视图模型的愚蠢问题。
public CustomerModel()
    {
        IsActive = true;
        if (Phones == null)
        {
            Phones = new List<Phone>();
        }
        if (Addresses == null)
        {
            Addresses = new List<Address>();
        }
    }

    public Guid Id { get; set; }
    public Guid OrganizationId { get; set; }

    [Required]
    public String FirstName { get; set; }
    public String MiddleName { get; set; }
    [Required]
    public String LastName { get; set; }

    [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address.")]
    public String EmailAddress { get; set; }

    [DataType(DataType.Date)]
    public DateTime? DateOfBirth { get; set; }

    public List<Phone> Phones { get; set; }
    public List<Address> Addresses { get; set; }
}
<tbody id="tblAddressRows">
    @foreach (var address in Model.Addresses)
    {
        Html.RenderPartial("_AddressRow", address);
    }
</tbody>
<td>
    @Html.HiddenFor(a => a.Id)
    @Html.DropDownList("AddressTypeId", ViewData["AddressTypeId"] as SelectList)
</td>
<td class="AddressLines">
    @Html.EditorFor(a => a.AddressLine1)
    @Html.EditorFor(a => a.AddressLine2)
</td>
<td>
    @Html.EditorFor(a => a.City)
</td>
<td>
    @Html.DropDownListFor(m => m.StateProvinceId,  ViewData["StateProvinceId"] as SelectList, new {@class = "State"})
</td>
<td>
    @Html.EditorFor(a => a.PostalCode, new {@class = "ZipCode"})
</td>
<td>
    @Html.DropDownList("CountyId", ViewData["CountyId"] as SelectList, new {@class = "County"})
</td>
//
// GET: /Customer/Manage/5
public ActionResult Manage(Guid id)
{
    CustomerModel customer = DataService.GetCustomer(id, HttpContext.User.Identity.Name);
    if (customer == null)
    {
        return HttpNotFound();
    }
    ViewBag.AddressTypeId = new SelectList(DataService.GetOrganizationAddressTypes(HttpContext.User.Identity.Name), "Id", "Name");
    ViewBag.PhoneTypeId = new SelectList(DataService.GetOrganizationPhoneTypes(HttpContext.User.Identity.Name), "Id", "Name");
    ViewBag.StateProvinceId = new SelectList(DataService.GetStates(), "Id", "Name");
    ViewBag.CountyId = new SelectList(DataService.GetCounties(0), "Id", "Name");
    return View(customer);
}