Как использовать два экземпляра одного и того же .ascx на одной странице в ASP.NET MVC? - PullRequest
3 голосов
/ 10 июля 2009

У меня есть два экземпляра элемента управления Address.ascx на странице ASP.NET MVC.

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

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

Конечно, с таким же кодом, я получу одинаковые идентификаторы для каждого поля в адресе. Я могу легко добавить строку к идентификатору полей, чтобы у меня были 'Street1_billing' и 'Street1_shipping', но я не понимаю, как сопоставить это с моделью.

Какое наилучшее решение для сопоставления модели с массивом элементов (в данном случае только 2). Я не знаю ни одного ASP.NET «из коробки» решения для этого.

Примечание: это немного похоже на этот вопрос , и я мог бы использовать это решение от Скотта Хансельмана , но это не совсем то, что я хочу. В моем случае я знаю, что у меня есть два элемента, так что, по сути, это массив из 2 элементов, но мне интересно, есть ли немного более элегантное решение.

PS. Я уверен, что об этом уже много раз спрашивали, но я просто не могу ввести правильные условия поиска. Пожалуйста, свяжите этот вопрос, если вам известны ошибки!

Ответы [ 2 ]

4 голосов
/ 10 июля 2009

Сначала добавьте класс Address к модели.

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"]) %>
3 голосов
/ 11 июля 2009

Вы можете иметь ViewModel

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

Значения элементов отображаются на правый элемент 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 выглядит необычно. Любая причина, по которой вы не можете поместить ее в Shared и получить к ней доступ

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

...