2009-07-10 4 views
3

ASP.NET MVC 페이지에 두 개의 Address.ascx 컨트롤 인스턴스가 있습니다.ASP.NET MVC에서 동일한 페이지에서 동일한 .ascx 인스턴스 두 개를 사용하는 방법은 무엇입니까?

물론이 코드는 정확히 주소의 각 입력란에 동일한 ID로 끝납니다. 'Street1_billing''Street1_shipping'을 가질 수 있도록 필드의 ID에 문자열을 쉽게 추가 할 수 있지만 모델에 매핑하는 방법이 명확하지 않습니다.

모델을 항목 배열에 매핑하는 가장 좋은 해결책은 무엇입니까 (이 경우 2 개). 나는 이것을 위해 상자에서 벗어난 ASP.NET 솔루션을 전혀 모르고 있습니다.

참고 : 이것은 this question과 약간 비슷하며 this solution from Scott Hanselman을 사용할 수 있지만 원하는 것은 아닙니다. 제 경우에는 두 개의 항목이 있다는 것을 알고 있습니다. 따라서 본질적으로 2 개의 항목 배열이 있지만 좀 더 우아한 해결책이 있는지 궁금합니다.

PS. 나는 이것이 여러 번 전에 물어 보았을 것이라고 확신하지만, 나는 단지 올바른 검색 용어를 넣을 수 없다. 당신이 속임수를 알고 있다면이 질문을 링크하십시오!

답변

3

을 당신은 formelements의 값에 매핑되는 뷰 모델

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

나는 재산 (ShippingAddress)의 이름에 인스턴스 이름을 설정합니다.

그런 다음 폼 요소는 ASCX의 장소는 드문 보이는이 양식

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

에 정의되어 있습니다.공유에 넣지 않고 액세스 할 수있는 이유는 무엇입니까?

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

?

+0

감사합니다. 지금까지 가장 깨끗한 해결책으로 보입니다. 나는 modelbinder이 똑똑하다는 것을 깨달았습니다 .--) 그리고 .ascx 위치에 관한 한, 기존의 어플리케이션에 쇼핑 바구니를 쓰고 있습니다. 쇼핑 카트 컨트롤을 가능한 한 분리 된 상태로 유지하려고합니다. –

+0

그 사람은 참으로 영리합니다. 내가 아직 보지 못한 한 가지 점은 같은 종류의 구문을 사용하여 경로의 값을 매핑 할 수 있는지 여부입니다. –

4

먼저 주소 클래스를 모델에 추가하십시오. 기본보기의 컨트롤러에서

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewPage<MyProject.Models.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
에서는이 같은 주소 모델을 상속 상단에 라인이 필요 두 주소를 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"]) %> 
관련 문제