【问题标题】:MVC Create page returning exceptionMVC 创建页面返回异常
【发布时间】:2012-03-13 14:35:46
【问题描述】:

我无法让我的创建功能正常工作。我正在尝试创建一个 Order 对象,其中包含一个 SalesPerson 和 Customer 对象。我的订单模型看起来像

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”类型,但该字典需要一个“Models.OrderViewModel”类型的模型项。我想也许我需要将 create 方法中的参数更改为 public ActionResult Create(OrderViewModel order) 但是当我这样做时,错误是:没有为此对象定义无参数构造函数。有人可以向 MVC Noob 提供一些关于我做错了什么的帮助吗?

【问题讨论】:

  • 您的视图顶部没有@model 行吗?如果是这样,请编辑添加。
  • 是的,有一个@model,我没有包含整个视图文件。
  • 我想出了如何通过将 Order 对象中的所有自定义对象更改为保存引用对象 ID 的 int 值来使其工作。然后在 OrderViewModel 中填充由 OrderController 中的 ID 引用的实际对象。

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

在动作中传递视图模型。 你得到的错误是因为你只创建了一个带参数的构造函数,但 MVC wnat 也是一个无参数的构造函数。

如果您不指定任何构造函数,Aps.net 4 会自动为您创建它,但如果您定义了一个,那么它不会主动创建一个您可能不想要的。

Look here。那应该比我解释得更好

【讨论】:

  • 感谢您的回复。这确实清除了异常,但是现在当我创建操作方法时收到一个空订单对象,而不是页面上指定的值...
  • 尝试在 ctor() 中创建 originalOrder 的实例。如果它是正确的atm,我不能尝试,但我很肯定:)
  • 没有骰子,我初始化了 originalOrder,它仍然返回空白。
  • 我将此标记为答案,因为它回答了如何清除异常的原始问题。感谢大家的帮助。
【解决方案2】:

所以这发生在我的模型绑定期间。 调试这种情况的最佳方法是实现从默认模型绑定器继承的模型绑定器,并将其设置为对象(订单)的默认模型绑定器。 尝试提供更多信息以获得更具体的答案。

您可以使用下面的链接作为自定义模型绑定和注册的示例 http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/

PS:在我看来,这不是将模型放入视图模型的最佳方式。 但仍有一些实现包含命令和服务,所以这取决于你。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多