¿Necesito un enlazador de modelos personalizado para mi acción Crear?
-
13-11-2019 - |
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>
Solución
Tienes que especificar un constructor sin parámetros para el InvitationRequestViewModel
para que el enlazador de modelos predeterminado pueda crear una instancia.