Нужен ли нам пользовательский ModelBinder для моего создания действий?

StackOverflow https://stackoverflow.com/questions/5993770

Вопрос

Я делал немного исследований по этому поводу, но у меня мало неисправностей, когда ModelBinding требуется в MVC 3. Я создал ViewModel для подачи данных на мой вид.

public class InvitationRequestViewModel
{
    public InvitationRequest InvitationRequest { get; private set; }

    public IEnumerable<SelectListItem> EventsList { get; private set; }

    public string EventId { get; set; }

    public InvitationRequestViewModel(InvitationRequest request)
    {
        InvitationRequest = request;
        EventsList = new SelectList(MyRepositoryAndFactory.Instance.FindAllEvents()
                .Select(events => new SelectListItem 
                { 
                    Value = events.ID.ToString(),
                    Text = String.Format("{0} - {1} - {2}", events.Name, events.Location, events.StartDate.ToShortDateString())
                }
            ), "Value", "Text");
    }
}
.

Мой приглашений контроллер имеет следующие методы действия

public ActionResult Create()
    {
        InvitationRequest request = new InvitationRequest(User.Identity.Name);

        return View(new InvitationRequestViewModel(request));
    } 

    [HttpPost]
    public ActionResult Create(InvitationRequestViewModel newInvitationRequest)
    {
        try
        {
            if (!ModelState.IsValid) return View(newInvitationRequest);

            newInvitationRequest.InvitationRequest.Save();
            MyRepositoryAndFactory.Instance.CommitTransaction();
            return RedirectToAction("Index");
        }
        catch
        {
            ModelState.AddModelError("","Invitation Request could not be created");
        }

        return View(newInvitationRequest);
    }
.

Я могу добраться до вида создания без проблем, и DDL заполнен списком доступных событий.Моя проблема состоит в том, что я ожидаю, что пригласительныйЗеeviewModel будет сопоставлен с методом создания httpPost.Вместо этого я просто получаю сообщение об ошибке «Сайт не может отображать страницу». Когда я использую подпись:

public ActionResult Create(FormCollection collection){ }
.

Тогда я вижу размещенные значения.Я надеялся, что не должен делать свой собственный сопоставленный код в контроллере.
Пользовательский ModelBinder ответ?

Редактировать Я использую сильно напечатанный вид в типе пригласительный экранзыViewModel, и это код DDL

<div class="editor-label">
        @Html.LabelFor(model => model.InvitationRequest.Event)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(x => x.EventId, Model.EventsList)
    </div>
.

Это было полезно?

Решение

Вы должны указать конструктор PARMETERLALL для InvitationRequestViewModel, поэтому связующее моделей по умолчанию может создать его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top