Question

J'ai fait un peu de recherche à ce sujet, mais j'ai un peu de mal à comprendre quand le modèle de modèle est nécessaire dans MVC 3. J'ai créé un ViewModel pour fournir des données à ma vue de création.

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

Mon contrôleur InvitationRequest a les méthodes d'action suivantes

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

Je peux atteindre la vue de création sans problème et le DDL est rempli d'une liste d'événements disponibles. Mon problème est que je m'attendais à ce que l'invitationRequestViewModel soit mappé sur la méthode de création httppost. Au lieu de cela, je reçois simplement une erreur disant que "le site Web ne peut pas afficher la page". Lorsque j'utilise la signature:

public ActionResult Create(FormCollection collection){ }

Ensuite, je peux voir les valeurs publiées. J'avais espéré ne pas avoir à faire mon propre code de mappage dans le contrôleur.
Un modèle personnalisé est-il la réponse?

Modifier j'utilise une vue fortement dactylographiée du type invitationRequestViewModel et c'est le code DDL

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

La solution

Vous devez spécifier un constructeur sans paramètre pour le InvitationRequestViewModel Ainsi, le liant du modèle par défaut peut l'instancier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top