Pregunta

He estado investigando un poco sobre esto, pero tengo algunos problemas para comprender cuándo se necesita la vinculación de modelos en MVC 3.He creado un ViewModel para proporcionar datos a mi vista Crear.

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");
    }
}

Mi controlador InvitationRequest tiene los siguientes métodos de acción

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);
    }

Puedo acceder a la vista Crear sin problemas y el DDL se completa con una lista de eventos disponibles.Mi problema es que esperaba que InvitationRequestViewModel se asignara al método HttpPost Create.En cambio, aparece un error que dice "El sitio web no puede mostrar la página".Cuando uso la firma:

public ActionResult Create(FormCollection collection){ }

Entonces puedo ver los valores publicados.Esperaba no tener que hacer mi propio código de mapeo en el controlador.
¿Es un ModelBinder personalizado la respuesta?

Editar Estoy usando una vista fuertemente escrita de tipo invitación requestviewmodel y este es el código DDL

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

Solución

Tienes que especificar un constructor sin parámetros para el InvitationRequestViewModel para que el enlazador de modelos predeterminado pueda crear una instancia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top