如何在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); %>
?
答
首先,向该模型添加一个地址类。
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"]) %>
谢谢。这看起来迄今为止是最干净的解决方案。我还没有意识到模型绑定器是这个聪明的:-)并且就.ascx位置而言,我正在现有应用程序中编写一个购物车,并且希望尽可能地保持购物车控件的独立性。 – 2009-07-11 18:49:42