MVC Создать страницу, возвращающую исключение - PullRequest
0 голосов
/ 13 марта 2012

У меня проблемы с настройкой функции создания. Я пытаюсь создать объект 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». Я подумал, что, возможно, мне нужно изменить параметр в методе создания на public ActionResult Create(OrderViewModel order), однако, когда я делаю это, возникает ошибка: для этого объекта не определен конструктор без параметров. Может ли кто-нибудь оказать помощь MVC Noob о том, что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 13 марта 2012

Вам нужно назвать параметр вашей модели model, чтобы автоматическое связывание модели могло работать;в противном случае он будет ожидать, что все имена полей формы будут иметь префикс order..Вам также необходимо предоставить конструктор без параметров для модели представления или пользовательского связывателя модели.Связыватель модели по умолчанию довольно умен, но он ожидает конструктор без параметров.

0 голосов
/ 14 марта 2012

Так что происходит во время привязки модели, как по мне.Наилучшим способом отладки таких обстоятельств является реализация связывателя модели, унаследованного от значения по умолчанию, и установка его в качестве связывателя модели по умолчанию для вашего объекта (Order).Попробуйте предоставить больше информации для более конкретного ответа.

Вы можете использовать ссылку ниже в качестве образца привязки пользовательской модели и регистрации http://www.markeverard.com/blog/2011/07/18/creating-a-custom-modelbinder-allowing-validation-of-injected-composite-models/

PS: на мой взгляд, это не лучший способпомещать модели в модели.но все еще существуют реализации, которые содержат команды и службы, так что решать вам.

0 голосов
/ 13 марта 2012

в действии передать viewmodel.Ошибка, которую вы получаете, состоит в том, что вы создали только конструктор с параметрами, но MVC также не содержит конструктор без параметров.

Aps.net 4 создаст его автоматически для вас, если вы не укажете конструктор, но если выопределите один, тогда не нужно начинать создавать то, что, возможно, вам не нужно.

Смотрите здесь .Это должно объяснить лучше, чем я

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...