2009-05-19 6 views
2

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

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

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 и проанализировать его соответствующим образом. Проблема в том, что это жалуется, что нет конструктора без параметров для viewmodel (а его нет) - и я не уверен, что это правильный способ сделать это. Ничто из того, что я пробовал, не сработало, и мне действительно нужна помощь!

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

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

ответ

1

Я считаю, что я получил его:

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

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

public class CustomerFormViewModelBinder : DefaultModelBinder 
{ 
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var model = new CustomerFormViewModel(customer) 
    } 
} 
+0

Проводили некоторые исследования и пришли к выводу, что, как вы говорите, пользовательская модель Binder - это именно то, что мне нужно. Теперь мне просто нужно выяснить, как написать один! Спасибо за ваш комментарий - я приму ваше предложение и посмотрю, смогу ли я заставить его работать. – user101306