2012-03-13 41 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的最佳途径。 但仍然有包含命令和服务的实现,所以它取决于你。