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

问题描述:

我在ASP.NET MVC页面中有两个Address.ascx控件实例。如何在ASP.NET MVC的同一页中使用两个相同的.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。我确信之前已经有很多次提到过这个问题,但我似乎无法提供正确的搜索条件。请链接这个问题,如果你知道愚蠢!

你可以有一个视图模型

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

我设置了实例名到属性(ShippingAddress)的名称。

然后形式元素以这种形式

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

定义的ASCX的地方看起来少见。任何你不把它放在共享和访问的原因

<% Html.RenderPartial("AddressControl",Model.ShippingAddress); %> 

+0

谢谢。这看起来迄今为止是最干净的解决方案。我还没有意识到模型绑定器是这个聪明的:-)并且就.ascx位置而言,我正在现有应用程序中编写一个购物车,并且希望尽可能地保持购物车控件的独立性。 – 2009-07-11 18:49:42

首先,向该模型添加一个地址类。

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,你需要在顶部的行继承了地址模式,就像这样:

<%@ 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"]) %>