Benötige ich einen benutzerdefinierten Modellbinder für meine Erstellungsaktion?
-
13-11-2019 - |
Frage
Ich habe ein wenig darüber recherchiert, aber ich habe ein wenig Probleme zu verstehen, wann Modelbinding in MVC 3 benötigt wird.Ich habe ein Ansichtsmodell erstellt, um Daten für meine Erstellungsansicht bereitzustellen.
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");
}
}
Mein InvitationRequest-Controller verfügt über die folgenden Aktionsmethoden
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);
}
Ich kann die Erstellungsansicht problemlos erreichen und die DDL wird mit einer Liste der verfügbaren Ereignisse gefüllt.Mein Problem ist, dass ich erwartet habe, dass das InvitationRequestViewModel der HttpPost-Erstellungsmethode zugeordnet wird.Stattdessen erhalte ich nur die Fehlermeldung "Die Website kann die Seite nicht anzeigen".Wenn ich die Signatur benutze:
public ActionResult Create(FormCollection collection){ }
dann kann ich die geposteten Werte sehen.Ich hatte gehofft, keinen eigenen Mapping-Code im Controller erstellen zu müssen.
Ist ein benutzerdefinierter Modellbinder die Antwort?
BEARBEITEN Ich verwende eine stark typisierte Ansicht vom Typ InvitationRequestViewModel und dies ist der DDL-Code
<div class="editor-label">
@Html.LabelFor(model => model.InvitationRequest.Event)
</div>
<div class="editor-field">
@Html.DropDownListFor(x => x.EventId, Model.EventsList)
</div>
Lösung
Sie müssen einen parameterlosen Konstruktor für die angeben InvitationRequestViewModel
der Standardmodellordner kann es also instanziieren.