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

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

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

我敢肯定这是我在这里做错的可悲的基础...

解决...

我知道我缺少一些基本知识,答案是为Address和Phone对象简单创建自定义视图模型。这些新的视图模型可以包含每个选择列表的列表...

模型样本

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);
}

参考方案

您在这里有很多错误,有些还没有发现。但是你将。

第一个是永远不要将下拉列表的集合命名为所选值。 MVC以某些非显而易见的方式使用ViewBagViewState,如果这样做,您将遇到很多麻烦。将项目列表更改为StateProvinceListCountyList以及PhoneTypeListAddressTypeList

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

相反,您应该使用EditorTemplate,它将执行几项操作。首先,EditorTemplate将自动迭代所有集合,其次,它使用适当的名称(考虑父类)来呈现表单控件的名称。

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

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

在旁边:

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

另一件事,为什么要在构造函数中使用if块?根据定义,构造函数仅在构造对象时被调用,因此属性将始终为null(嗯,有人可以从您的类派生并在子类构造函数中设置这些属性,但是如果是您的代码,您会知道的)

用symfony隐藏树枝中的表格行 - javascript

我正在开始编码。我正在使用Symfony 3.3我想用复选框隐藏(并显示)表上的a或某些特定行。我尝试使用javascript和jquery。我希望隐藏的行保持隐藏状态。我不知道该怎么做。这是我的树枝{% block body %} <div class="container"> <h3>List of produ…

如何使用WTForms制作具有唯一ID的多个复选框,以便可以将其存储在货架上? - python

如何使用WTForms制作多个复选框并将其呈现到我的html页面?这是我使用WTForms提出的内容,但有人告诉我使用Boolean(True,False)它将仅应用于一个复选框,而不是多个复选框。我如何将所选的复选框附加到字典中有唯一的ID吗?我对python,flask和WTForms相当陌生。感谢您抽出宝贵的时间来帮助我。也可以给我一些建议/指南来帮助…

Div单击与单选按钮相同吗? - php

有没有一种方法可以使div上的click事件与表单环境中的单选按钮相同?我只希望下面的div提交值,单选按钮很丑代码输出如下:<input id="radio-2011-06-08" value="2011-06-08" type="radio" name="radio_date&#…

故障排除“警告:session_start():无法发送会话高速缓存限制器-标头已发送” - php

我收到警告:session_start()[function.session-start]:无法发送会话缓存限制器-标头已发送(错误输出开始如果我将表单数据提交到其他文件进行处理,则可以正常工作。但是,如果我将表单数据提交到同一页面,则会出现此错误。请建议<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0…

使用javascript在客户端的列表视图中选择所有复选框 - javascript

我有一个列表视图,在标题中有一个复选框。如果标题复选框已选中/未选中,我想选择行中的所有复选框。如何在客户端实现此目标?这是ListView设计代码。<asp:ListView ID="lvTypes" runat="server" GroupPlaceholderID="groupPlaceHolde…