2011-09-23 2 views
2

ASP.NET MVC 3.0을 사용하여 판매 주문 관리를위한 응용 프로그램을 개발 중입니다. 고객 정보를 추가 할 수있는 페이지를 개발해야합니다.ASP MVC 3.0 복잡한보기

고객 정보는

public class Customer 
    { 
     public int ID { get; set; } 
     public string Code { get; set; } 
     public string Name { get; set; } 
     public string Alias { get; set; } 
     public int DefaultCreditPeriod { get; set; }   
     public Accounts Accounts { get; set; } 
     public IList<Address> Addresses { get; set; } 
     public IList<Contact> Contacts { get; set; } 
    } 

public class Accounts 
    { 
     public int ID { get; set; } 
     public string VATNo { get; set; } 
     public string CSTNo { get; set; } 
     public string PANNo { get; set; } 
     public string TANNo { get; set; } 
     public string ECCNo { get; set; } 
     public string ExciseNo { get; set; } 
     public string ServiceTaxNo { get; set; } 
     public bool IsServiceTaxApplicable { get; set; } 
     public bool IsTDSDeductable { get; set; } 
     public bool IsTCSApplicable { get; set; } 
    } 

public class Address 
    { 
     public int ID { get; set; } 
     public AddressType Type { get; set; }   
     public string Line1 { get; set; } 
     public string Line2 { get; set; } 
     public string Line3 { get; set; } 
     public string Line4 { get; set; } 
     public string Country { get; set; } 
     public string PostCode { get; set; } 
    } 

public class Contact 
    { 
     public int ID { get; set; } 
     public ContactType Type { get; set; } 
     public string Name { get; set; } 
     public string Title { get; set; } 
     public string PhoneNumber { get; set; } 
     public string Extension { get; set; } 
     public string MobileNumber { get; set; } 
     public string EmailId { get; set; } 
     public string FaxNumber { get; set; } 
     public string Website { get; set; } 
    } 

고객 (일반 정보, 계정 정보는 정보와 연락처 정보를 주소) 모든 고객 정보를 기입 한 페이지를 필요 포함합니다. 여러 주소 (청구서 발송, 배송 등) 및 여러 연락처 (판매, 구매)가 있습니다. 나는 MVC가 처음이다. 위의보기를 만들고 여러 주소를 동적으로 추가하는 방법은 무엇입니까?

public ActionResult Index() { 
    var customer = GetCustomer(); // returns a Customer 
    return View(customer); 
} 

을 그리고보기는 다음과 같이 보입니다 :

+1

불쾌감은 없지만 어떤 종류의 대답을 기대하십니까? 당신이 요구하고있는 것은 많은 학습을 필요로하는 많은 개별 단계를 포함합니다. 가장 좋은 방법은 공식 [Music Store 샘플] (http://www.asp.net/mvc/tutorials/mvc-music-store-part-1)과 같은 몇 가지 예를보고 페이지를 만들어보십시오. 당신이 더 구체적인 질문을 생각해 내면 다시 돌아 오게됩니다. –

답변

1

나는 종종 이런 종류의 상황을 처리하기 위해 래퍼 모델을 만듭니다.

[HttpPost] 
public ActionResult(Customer customer, Accounts accounts, List<Address> addressList) 
{ 
    //Handle db stuff here 
} 

으로이처럼 보이는 게시물을받을

@model MyNamespace.CustomerWrapperModel 

@Html.EditorFor(model => model.Customer) 
@Html.EditorFor(model => model.Accounts) 
@Html.EditorFor(model => model.AddressList) 

와 컨트롤러가 :

public class CustomerWrapperModel 
{ 
    public Customer Customer { get; set;} 
    public Accounts Accounts { get; set;} 
    public List<Address> AddressList { get; set} 

    //Add 
    public CustomerWrapperModel() 
    { 

    } 

    //Add/Edit 
    public CustomerWrapperModel(Customer customer, Accounts accounts, List<Address> addressList) 
    { 
     this.Customer = customer; 
     this.Accounts = accounts; 
     this.AddressList = addressList; 
    } 
} 

를 입력 한 다음 CustomerWrapperModel의 것으로보기를 선언과 같이 편집기를 사용 동적으로 주소를 추가하는 것만으로도 MVC 유효성 검사를 사용하고 올바른 목록 인덱스로 목록을 올바르게 구성하려는 경우 List 매개 변수를 다음과 같이 사용할 수 있습니다.

@model List<MyNamespace.Address> 

@{ 
    //Hack to get validation on form fields 
    ViewContext.FormContext = new FormContext(); 
} 

@Html.EditorForModel() 

당신이 필드를 모두 해결합니다

[HttpPost] 
public PartialResult AddAddress(List<Address> addressList) 
{ 
    addressList.Add(new Address); 

    return PartialView(addressList); 
} 

후 바로 다시 주소 필드를 렌더링하는 부분도 있습니다 컨트롤러는이 같은 도우미 컨트롤러에 현재 주소를 게시하는 것입니다 한 컨테이너에 저장 한 다음 반환 된 데이터로 기존 컨테이너를 덮어 쓸 수 있으며 새 주소 필드가 맨 아래에 추가됩니다. 컨테이너를 업데이트 한 후에 유효성 검사를 다시하기 위해 다음과 같은 작업을 수행 할 수 있습니다.

NB. 일부 사람들은이 방법으로 문제가 있다는 것을 알고 있습니다. 서버 측에서 페이지를 추가하기 만하면 클라이언트 측에 쉽게 추가 될 수 있습니다. (항상 모든 클라이언트 측에서 사용했지만 한 번 시도했습니다. 방법과 결코 돌아 가지 않았다). 이 방법을 사용하는 이유는 삽입 항목과 추가 항목이 많이 있고 개체에 많은 속성이있는 경우 목록 항목에 대한 인덱스를 올바르게 유지하는 가장 쉬운 방법이기 때문입니다. 또한 부분 뷰를 사용하여 데이터를 렌더링하면 새로 추가 된 클라이언트 측 필드에 대한 유효성 검사를 손으로 직접 수행하지 않고 즉시 새 필드에 유효성 검사가 생성되도록 할 수 있습니다. 트레이드 오프는 대부분의 경우 아약스 요청 중에 전송되는 소량의 데이터입니다.

AddAddress 컨트롤러에 보내는 필드를 좀 더 세부적으로 조정할 수도 있습니다. 전체 폼을 컨트롤러에 게시하고 주소 필드를 제외한 모든 항목을 무시하기 때문에 빠른 서버를 사용하고 있습니다. 원치 않는 양식 필드의 추가 (사소한) 오버 헤드는이 유형의 기능을 더 대역폭 효율적인 방식으로 코딩하는 데 낭비 할 수있는 시간에 비해 무시할 수 있습니다.

+0

감사합니다 Rob. 나 해보자. – RAM

0

는이 같은 컨트롤러에서보기 호출에 루트 모델 개체를 전달할

@model Customer 

<!DOCTYPE html> 
<!-- etc., etc. --> 
<h1>Customer @Model.Name</h1> 
<ul> 
@foreach (var address in Model.Addresses) { 
    <li>@address.Line1</li> 
} 
</ul> 

하나는 사진을 얻을 수 있습니다.

위의 코드는 ASP.NET MVC 3 (this blog post 참조)의 새로운 @model 지시문에 따라 다릅니다.

0

좋은 질문입니다 : D이 하드에없는 일을 같은 Accounts 정상 탐색 속성 :

@Html.EditorFor(model => model.Accounts.ID) 

@Html.EditorFor(model => model.Accounts.VATNo) 

당신이 원하는 일을 할 것입니다. 그러나 컬렉션 탐색 속성 (AddressesContacts)의 경우 기본적으로 한 곳에서이 작업을 수행 할 수 없습니다. Addresses에 대해 다른 페이지를 사용하고 Contacts에 하나를 사용하는 것이 좋습니다. 왜냐하면 그것은 가장 쉬운 방법이기 때문입니다. 당신은 (밖으로 AJAX 요청과도 등) 한 곳에서이 작업을 수행하려는 경우, 당신은, Customer으로보기를 만들 모델에 대한 비계를 사용하고는 간단한 탐색 속성, 그리고 수있는 목록에 대한 (Addresses, Contacts) 당신은 (추가, 각 Address에 대한 예를 들어 Array에 넣어)에 input 필드 자바 스크립트에 추가 서버 및 사후 필드해야합니다. 서버에서 기본 모델 바인더와 기본 모델 바인더로 기본 모델과 간단한 속성을 가져올 수 있으며 목록의 경우 1) 직접 만든 모델 바인더를 만들 수 있습니다. 2) 입력 된 문자열에서 직접 구문 분석 할 수 있습니다. 좋은 잠금