2011-05-04 2 views
1

저는 ASP MVC 3을 처음 접했고 다음과 같은 질문이 있습니다. 서버에 데이터를 보내기 위해 자체적으로 게시물 요청을하는 양식이 있습니다. 양식에는 Sales People의 DropDownList가 들어 있으며이 목록은 데이터베이스에서 채워집니다. 주요 활동은 다음과 같습니다ASP MVC 3에서 DropDownList를 채우는 컬렉션을 잃지 않는 방법은 무엇입니까?

public ActionResult Index() 
{ 
    var viewModel = new OrderSearchViewModel(); 
    viewModel.SalesPeople = GetSalesPeopleList(); // This queries the DB 
    return View(viewModel); 
} 

을 그리고 뷰 모델은 다음과 같습니다

public class OrderSearchViewModel 
{ 
     public string Id { get; set; } 
     public DateTime? StartDate { get; set; } 
     public DateTime? EndDate { get; set; } 
     public string PostCode { get; set; } 
     public int SalesPersonId { get; set; } 
     public string SalesPersonRef { get; set; } 
     public int OrderType { get; set; } 
     public string SerialNo { get; set; } 
     public string CustomerPO { get; set; } 
     public List<SalesPerson> SalesPeople { get; set; } 
} 

그래서 인덱스보기에서 나는 지수 (영업 사원리스트가 null로 설정되어있는 양식을 제출할 때 HttpPost 메서드)를 사용하고 여전히 채워지는 목록과 동일한 뷰를 표시하려고합니다. 그럼에도 불구하고 이렇게하려면 데이터베이스를 다시 쿼리해야합니다. 이 일을 피하는 것이 가장 좋은 방법입니까?

편집 : - 그런 식으로

[HttpPost] 
public ActionResult Index(OrderSearchViewModel viewModel) 
{ 
    var result = QueryOrders(viewModel); 
    //code update the model with the results 
    return View(viewModel); 
} 
+0

왜 데이터베이스를 다시 쿼리하는 것이 좋지 않다고 생각하십니까? 또한 - 여기에 .NET MVC에 대한 좋은 소개가 있습니다 -> http://www.mvcconf.com/videos – Dan

답변

0

Ajax를 사용하여 양식을 제출하고 단지 JSON을 사용하여 클라이언트에 후 작업의 결과를 반환 :

내 POST 지수는 코드를 moethod

이 같은 것입니다 데이터베이스는 해당 목록에 대해 두 번 적중되지 않으며 사용자는 더 매끄러운 경험을 얻습니다.

+0

좋은 생각 같습니다. 그러나, 나는 ASP MVC 3에 익숙하다. 그래서 만약 당신이 어딘가에 링크되어 있다면 이것이 어떻게 이루어 졌는지를 볼 수있다. 나는 매우 감사 할 것이다. – groovejet

+0

다음은 좋은 사례가있는 비디오입니다. 무료 사고 개발자이므로 시나리오에 가장 적합한 것이 무엇인지 결정해야합니다. -> http://channel9.msdn.com/Series/mvcConf/mvcConf-2 -Eric-Sowell-Evolution-Practices-in-Using-jQuery-and-Ajax-ASPNET-MVC- 응용 프로그램 – Dan

0

POST 인덱스 메서드는 FormCollection에서 SalesPeople의 모든 값을 가져와야합니다. 항상 Request.FormCollection을 사용하여 모든 양식 데이터를 쿼리 할 수 ​​있습니다. 또 다른 선택은 DB 데이터를 캐싱하는 것입니다. :) 어쨌든 POST 인덱스 메소드의 코드

+0

이제 게시글에 있습니다. – groovejet

0

OrderSearchViewModel에는 SalesPeople 컬렉션이 없어야합니다. 이는 단일 책임 원칙을 위반하기 때문입니다. SalesPersonId에 대해 EditorTemplate을 재정의하고 드롭 다운을 채우는 별도의 조치를 작성해야합니다.

여기 내 응용 프로그램의 코드입니다. 예제로 사용할 수 있습니다. 내 CategoryId 속성에는 Guid 유형이 있습니다. Guid 유형을 대체해야합니까? int로?

템플릿 오버라이드 (override) 사용 mvcextensions :

public class CreateAccidentCommandMetadata : ModelMetadataConfiguration<CreateAccidentCommand> 
{ 
    public CreateAccidentCommandMetadata() 
    { 
     Configure(x => x.TrackingNumber) 
      .Required(); 

     Configure(x => x.CategoryId) 
      .Required() 
      .DisplayName("Category") 
      .Template(MVC.Accident.Views.EditorTemplates.Category); 
    } 
} 

템플릿 내용 :

@model Guid? 
@{Html.RenderAction(MVC.Category.List(ViewData.ModelMetadata, Model));} 

Category.List 액션 :

public virtual ActionResult List(ModelMetadata modelMetadata, Guid? selected) 
    { 
     ViewData.Model = queryService.GetList(new GetCategoryListQueryContext()) 
      .Select(x => new SelectListItem 
          { 
           Text = x.Name, 
           Value = x.Id.ToString(), 
           Selected = selected.HasValue && x.Id == selected 
          }) 
      .ToList(); 

     //it is important to set up ModelMetadata after model 
     ViewData.ModelMetadata = modelMetadata; 

     return View(); 
    } 

와 아주 간단보기 :

,
+0

나는 이것이 단일 책임을 위반하고, 그의 시나리오에서 과잉이라고 할지라도 필연적으로 나쁜 것 (모든 설계 원리를 한 번에 따라갈 수는 없음) ... – Dan

+0

하지만 많은 것을 단순화합니다. OrderSearchViewModel을 검색하는 작업은 SalesPerson에 대해 신경 쓰지 않을 수 있습니다. 요청간에 SalesPerson을 저장하기 위해 TempData를 다룰 필요가 없습니다. 2 차 데이터베이스 쿼리를 방지하는 책임 NHibernate의 2 차 수준 캐시와 같은 인프라 구조 수준을 적용 할 것입니다. – xelibrion

관련 문제