如何在ASP.NET MVC的同一页面中使用相同.ascx的两个实例?

时间:2009-07-10 03:34:58

标签: asp.net-mvc modelbinders

我在ASP.NET MVC页面中有两个Address.ascx控件实例。

   <h1>Shipping Address</h1>
   <% Html.RenderPartial("Controls/AddressControl"); %>

   <h1>Billing Address</h1>
   <% Html.RenderPartial("Controls/AddressControl"); %>

当然,使用与此完全相同的代码,我将最终为地址中的每个字段使用相同的ID。我可以轻松地将字符串附加到字段的ID中,以便我有'Street1_billing''Street1_shipping',但我不清楚如何将其映射到模型。

什么是将模型映射到项目数组的最佳解决方案(在本例中仅为2)。 我不知道任何ASP.NET“开箱即用”的解决方案。

注意:这与this question略有相似,我可以使用this solution from Scott Hanselman,但这不完全是我想要的。在我的情况下,我知道我有两个项目,所以它基本上是一个2项数组,但我想知道是否有一个稍微更优雅的解决方案。

PS。我确信之前已经多次询问过,但我似乎无法用正确的搜索词来表达。如果你知道欺骗,请链接这个问题!

2 个答案:

答案 0 :(得分:4)

首先,将地址类添加到模型中。

public class Address
{
    String StreetAddress1 { get; set }
    String StreetAddress2 { get; set }
    String City { get; set }
    String State { get; set }
    String Zip { get; set }
}


Address.ascx 中,您需要在顶部继承Address模型的行,如下所示:

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewPage<MyProject.Models.Address>" %>


在主视图的控制器中,将两个地址压入ViewData。

Address myAddressObject1 = new Address
{
   AddressLine1 = "123 Anywhere Street",
   // ..etc.  Same with MyAddressObject2.  Or, just populate from database.
}

ViewData["Address1"] = myAddressObject1;
ViewData["Address2"] = myAddressObject2;
//
// do other stuff as needed
//
Return View();


主视图中,按以下方式调用两个地址子视图:

<%= Html.RenderPartial("Address", ViewData["Address1"]) %>
<%= Html.RenderPartial("Address", ViewData["Address2"]) %>

答案 1 :(得分:3)

您可以拥有ViewModel

OrderCheckoutViewModel
{
    public Address ShippingAddress{get;set;}
    public Address BillingAddress{get;set;}
}

如果具有

形式,则formelements的值将映射到ViewModel的右侧成员
<input type="text" name="ShippingAddress.StreetAddress1"><input>

从StreetAddress1到ShippingAddress.StreetAddress1没有简单而优雅的方法。 我的地址模型有以下形式:

public class Address
{
    String StreetAddress1 { get; set }
    String StreetAddress2 { get; set }
    String City { get; set }
    String State { get; set }
    String Zip { get; set }
    String InstanceName{ get; set }
}

我将InstanceName设置为属性的名称(ShippingAddress)。

然后以这种形式定义表单元素

<input type="text" name="<%=Model.InstanceName%>.StreetAddress1"><input>

ascx的地方看起来并不常见。您之所以没有将其置于共享并通过

访问它的原因
<% Html.RenderPartial("AddressControl",Model.ShippingAddress); %>