2012-03-13 2 views
0

제 작성 기능을 올바르게 작동시키는 데 문제가 있습니다. SalesPerson 및 Customer 객체가있는 Order 객체를 만들려고합니다. 나는 다음과 같은 한MVC 페이지 반환 예외 생성

public class OrderViewModel 
{ 
    private sunburstdb db = new sunburstdb(); 

    public Order originalOrder { get; set; } 
    public IList<SelectListItem> SalesPeopleList { get; set; } 
    public IList<SelectListItem> CustomersList { get; set; } 
    public IList<SelectListItem> OrderStatusList { get; set; } 

    public OrderViewModel(Order order) 
    { 
     originalOrder = order; 
    } 
} 

내 컨트롤러에서 :

// 
    // GET: /Order/Create 

    public ActionResult Create() 
    { 
     Order order = new Order(); 
     OrderViewModel viewModel = new OrderViewModel(order); 
     //IList<SelectListItem> result = new List<SelectListItem>(); 
     viewModel.SalesPeopleList = new List<SelectListItem>(); 
     foreach (SalesPerson person in db.SalesPeople) 
     { 
      var temp = new SelectListItem(); 
      temp.Text = person.FullName; 
      temp.Value = person.ID.ToString(); 
      viewModel.SalesPeopleList.Add(temp); 
     } 
     //viewModel.SalesPeopleList = new SelectList(result); 
     //result.Clear(); 
     viewModel.CustomersList = new List<SelectListItem>(); 
     foreach (Customer person in db.Customers) 
     { 
      var temp = new SelectListItem(); 
      temp.Text = person.FullName; 
      temp.Value = person.ID.ToString(); 
      viewModel.CustomersList.Add(temp); 
     } 
     //viewModel.CustomersList = new SelectList(result); 

     return View(viewModel); 
    } 

    // 
    // POST: /Order/Create 

    [HttpPost] 
    public ActionResult Create(Order order) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Orders.Add(order); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(order); 
    } 

마지막으로 내보기가 몇 꽤 표준입니다 그때 뷰 모델을 만들어

public class Order 
{ 
    public int ID { get; set; } 
    public SalesPerson SalesPerson { get; set; } 
    public bool PreviousWork { get; set; } 
    public OrderStatus Status { get; set; } 
    public Customer Customer { get; set; } 
    public List<OrderLineItem> LineItems { get; set; } 
} 

처럼 내 주문 모델 본다 순서대로 데이터를 채우는 필드

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Order</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.SalesPerson) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Order.SalesPerson", Model.SalesPeopleList) 
    </div> 
      <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.Customer) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Order.Customer", Model.CustomersList); 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.originalOrder.PreviousWork) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.originalOrder.PreviousWork) 
     @Html.ValidationMessageFor(model => model.originalOrder.PreviousWork) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

내가 이것을 실행하고 나는 다음을 얻을 새로운 질서 만들려고 : 사전에 전달 모델 항목 유형 'Models.Order'입니다 만,이 사전 모델 '유형의 모델 항목을 필요로 .OrderViewModel '. 어쩌면 내가 만든이 메서드는 매개 변수를 변경할 필요가 public ActionResult Create(OrderViewModel order) 그러나 내가 할 때이 오류가 있습니다 : 매개 변수가없는 생성자가이 개체에 정의 된. 누군가 내가 MVC 멍청한 놈에게 내가 뭘 잘못하고 있는지에 대한 도움을 줄 수 있습니까?

+0

보기 상단에 @model 행이 있습니까? 그렇다면 편집하여 추가하십시오. –

+0

예, @ 모델이 있습니다. 전체보기 파일을 포함하지 않았습니다. – azorr

+0

Order 개체의 모든 사용자 지정 개체를 참조 된 개체의 ID를 보유하는 int 값으로 변경하여이 작업을 수행하는 방법을 알았습니다. 그런 다음 OrderViewModel에서 OrderController의 ID로 참조되는 실제 오브젝트를 채 웁니다. – azorr

답변

0

동작에서 viewmodel을 전달합니다. 매개 변수가있는 생성자 만 만들었으므로 MVC는 매개 변수없는 생성자이기 때문에 오류가 발생합니다.

Aps.net 4는 생성자를 지정하지 않으면 자동으로 생성되지만 정의한 경우에는 원하지 않는 것을 생성하지 않습니다.

Look here. 그게 나보다 더 잘 설명해야합니다

+0

응답 해 주셔서 감사합니다. 그건 예외를 지우지 만, 지금은 action 메소드를 생성 할 때 페이지에 지정된 값이 아닌 null order 객체를 받는다. – azorr

+0

ctor()에 originalOrder의 인스턴스를 만들어보십시오. 나는 그것이 맞다면 시도 할 수는 없지만 나는 긍정적이다 :) – Iridio

+0

주사위가 없기 때문에 originalOrder를 초기화했고 여전히 공백으로 돌아온다. – azorr

0

자동 모델 바인딩이 작동하려면 모델 매개 변수 이름을 model으로 지정해야합니다. 그렇지 않으면 모든 양식 필드 이름 앞에 order. 접두어가 붙을 것으로 예상됩니다. 또한 viewmodel 또는 사용자 정의 모델 바인더에 대해 매개 변수없는 생성자를 제공해야합니다. 기본 모델 바인더는 꽤 똑똑하지만 매개 변수없는 생성자를 기대합니다.

0

저 역시 모델 바인딩 중에 발생합니다. 그런 상황을 디버깅하는 가장 좋은 방법은 기본 바인더에서 상속 된 모델 바인더를 구현하고 개체의 기본 모델 바인더로 설정하는 것입니다 (순서). 자세한 답변을 보려면 더 많은 정보를 제공해보십시오.

사용자 지정 모델 바인더의 샘플 및 등록 http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/

PS로 아래 링크를 사용할 수 있습니다 내 의견으로는 viewmodels에 모델을 넣을 수있는 가장 좋은 방법이 아니다. 하지만 여전히 명령과 서비스를 포함하는 구현이 있으므로 여러분에게 달려 있습니다.