Проблемы с пользовательской моделью MVC - PullRequest
2 голосов
/ 19 мая 2009

Я немного новичок в MVC, так что вам придется простить то, что я считаю элементарным вопросом.

Я создал пользовательскую модель представления, чтобы в моей форме был список с несколькими вариантами выбора:

public class CustomerFormViewModel
{
    public Customer Customer { get; private set; }
    public MultiSelectList CustomerType { get; private set; }

    public CustomerFormViewModel(Customer customer)
    {
        Customer = customer
        // this returns a MultiSelectList:
        CustomerType = CustomerOptions.Get_CustomerTypes(null);
    }
}

Я обнаружил, что моя первая попытка захватила только первое значение множественного выбора, и я догадался, что это потому, что мои действия создания выглядели так:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Customer customer) { ... }

Итак, я решил изменить это на:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(CustomerFormViewModel model) { ... }

Так что я могу получить полный вывод из MultiSelectList и проанализировать его соответственно. Проблема в том, что это жалуется на то, что не существует конструктора без параметров для модели представления (и его нет) - и я не уверен, что это правильный способ исправить это. Ничто из того, что я пробовал, не сработало, и мне действительно нужна помощь!

Если это поможет, мой взгляд выглядит следующим образом:

<%@  Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MySite.Controllers.CustomerFormViewModel>" %>
...
<% using (Html.BeginForm())
    <%= Html.ListBox("CustomerType", Model.CustomerType)%>
...

Ответы [ 2 ]

1 голос
/ 20 мая 2009

Мне кажется, я понял:

public class CustomerModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var form = controllerContext.HttpContext.Request.Form;

        Customer customer = base.BindModel(controllerContext, bindingContext) as Customer;

        if (customer!= null)
        {
            customer.CustomerType= form["CustomerType"];
        }

        return customer;
    }
}

Вместе с записью в Application_Start () файла global.asax:

        ModelBinders.Binders.Add(typeof(Customer), new CustomerModelBinder());

, который помещает разделенный запятыми список выбора списка в поле. например "1,3,4".

1 голос
/ 19 мая 2009

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

public class CustomerFormViewModelBinder : DefaultModelBinder
{
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = new CustomerFormViewModel(customer)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...