2016-04-06 16 views
1

ist es möglich, ein Objekt von einer stark typisierten Ansicht über Http-POST an den Controller zu senden, das nicht dem Typ des ursprünglichen Modells entspricht.ASP Net MVC - Senden eines anderen Modells an POST

Zum Beispiel:

Ich habe ein Ansichtsmodell wie folgt aus:

public class PersonsViewModel 
{ 
    List<PersonViewModel> persons { get; set; } 

    PersonsViewModel() { } 
} 

public class PersonViewModel 
{ 
    //some properties 

    Person() { } 
} 

Jetzt habe ich diese Ansicht:

@model PersonsViewModel 

<div> 
    @for(int i = 0; i > Model.persons.Count; i++) 
{ 
    @Html.EditorFor(Model.persons[i]) 
} 
</div> 

Der Editor könnte wie folgt aussehen:

@model PersonViewModel 

<div> 
    @using (Html.Beginform("Postaction","Controller", FormMethod.Post)){ 
    <div> 
     <!-- properties and textboxes here + submit button --> 
    </div> 
} 
<div> 

Die Steuerung r Aktion

[ValidateAntiForgeryToken] 
     [HttpPost] 
     public ActionResult Postaction(PersonViewModel model) 
     { 
      //do something 
     } 
    } 

Das funktioniert nicht, weil es der Controller scheint ein PersonsViewModel Objekt erwartet. Meine bisherige Problemumgehung besteht darin, ein "großes" Formular zu erstellen, das alle PersonViewModel enthält und das vollständige PersonsViewModel an den Controller sendet.

Ist es irgendwie möglich, nur ein PersonViewModel an den Controller zu übergeben, obwohl die Ansicht stark typisiert ist?

Mit freundlichen Grüßen, Martin

+1

Auf die erste Frage veröffentlichen können, ist die kurze Antwort NEIN (standardmäßig in MVC). Der ModelBinder vergleicht den Namen der Felder, die Sie übergeben haben, um eine Übereinstimmung mit dem Typ zu erzielen, den Sie in Ihrer Aktion angegeben haben. Sie sollten einen Blick auf benutzerdefinierte Modell-Binder: http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder –

+0

Im Allgemeinen würden Sie die ID des PersonViewModel an den Controller senden, wo es würde dann eine Datenquelle abfragen, um das Datenobjekt abzurufen. –

Antwort

6

es getan werden könnte:

Wenn mit Sammlungen verwendet Html.EditorFor intelligent genug, um Eingangsnamen zu erzeugen, den Index enthalten so ModelBinder erfolgreich ein Modell als eine Sammlung von Objekten erstellen konnte. In Ihrem Fall, da Sie ein separates Formular pro PersonViewModel Objekt haben wollen, können Sie eine Teilansicht als Vorlage erstellen PersonViewModel für die Bearbeitung und Html.RenderPartial Helfer verwenden:

Sie _PersonViewModel.cshtml Teilansicht Unter der Annahme haben

@for(int i = 0; i > Model.persons.Count; i++) 
{ 
    Html.RenderPartial("_PersonViewModel", Model.persons[i]); 
} 

in die _PersonViewModel.cshtml Sie können keinen der Editorhelfer wie Html.EditorFor, Html.TextboxFor verwenden, da sie identische IDs für die gleichen Eigenschaften generieren werden, so dass Sie HTML-Eingaben manuell erstellen müssen:

@model PersonViewModel 

<div> 
    @using (Html.Beginform("Postaction","Controller", FormMethod.Post)){ 
    <div> 
     @*Nottice the usage of Html.NameFor(m=>m.FirstName) for generating a name property value *@ 
     <input type="text" name="@Html.NameFor(m=>m.FirstName)" value="@Model.FirstName"> 
    </div> 
} 
<div> 

diese Weise können Sie ein einzelnes PersonViewModel Objekt an die Controller-Aktion

+0

Danke, das ist genau das, was ich gesucht habe – Martin