2012-03-13 70 views
0

我有問題讓我的創建功能正常工作。我正在嘗試創建一個Order對象,其中包含一個SalesPerson和Customer對象。我的訂單模型看起來像MVC創建頁面返回異常

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

我再創建一個視圖模型:

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

最後我的看法是非常標準的一對夫婦字段按順序填充數據。

@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」。我想也許我需要將create方法中的參數更改爲public ActionResult Create(OrderViewModel order)但是,當我這樣做時,錯誤是:沒有爲此對象定義的無參數構造函數。有人可以幫助MVC Noob瞭解我做錯了什麼嗎?

+0

視圖頂部是否沒有@model行?如果是這樣,請編輯添加。 – 2012-03-13 15:20:16

+0

是的,有一個@model,我沒有包含整個視圖文件。 – azorr 2012-03-14 01:16:12

+0

我想通過將Order對象中的所有自定義對象更改爲僅包含所引用對象的ID的int值來解決此問題。然後在OrderViewModel中填充OrderController中由ID引用的實際對象。 – azorr 2012-03-14 14:12:16

回答

0

在action中傳遞viewmodel。 你得到的錯誤是因爲你只創建了一個帶參數的構造函數,但是MVC wnat也是一個無參數構造函數。

如果您沒有指定任何構造函數,Aps.net 4會自動爲您創建它,但是如果您定義了一個,那麼它不會主動創建一個可能不需要的構造函數。

Look here。這應該解釋得比我好

+0

感謝您的回覆。這樣做可以清除異常,但是現在,當我創建操作方法時會收到一個空命令對象,而不是頁面上指定的值。 – azorr 2012-03-13 15:18:26

+0

嘗試在ctor()中創建originalOrder的實例。我不能嘗試,如果它是正確的atm,但我是積極的:) – Iridio 2012-03-13 15:24:13

+0

沒有骰子,我初始化originalOrder,它仍然回來空白。 – azorr 2012-03-14 01:18:04

0

你需要命名你的模型參數model爲自動模型綁定可以工作;否則,它會期望所有的表單字段名稱前綴爲order.。您還需要爲視圖模型或自定義模型聯編程序提供無參數構造函數。默認的模型綁定器非常聰明,但它期望一個無參數的構造函數。

0

因此,在模型綁定過程中發生的情況與我一樣。 調試此類情況的最佳方式是實現模型聯編程序,該程序從默認模式繼承,並將其設置爲對象(Order)的默認模型聯編程序。 嘗試提供更多信息以獲取更具體的答案。

您可以使用下面的鏈接定製的模型綁定的樣本和註冊 http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/

PS:在我看來,這不是把模型導入的ViewModels的最佳途徑。 但仍然有包含命令和服務的實現,所以它取決於你。