2017-01-26 3 views
0

Ist es möglich, die Eigenschaftsnamen, die an eine Controller-Aktion gesendet werden, innerhalb einer @Html.EditorFor zu ändern?ASP.NET MVC5-Controller-Aktionsmethode Parameter Null

Ich habe eine Ansicht, die sowohl eine Liste von Objekten und ein Formular anzeigt, die es einem Benutzer ermöglichen sollten, einen zu erstellen. Ich möchte nur die neuen Objektwerte nach der Erstellung und nicht, wenn möglich, das gesamte Ansichtsmodell zurückgeben.

Mein Viewmodel Struktur für die Ansicht sieht wie folgt aus:

public class GenericIndexViewModel 
{ 
    public IEnumerable<GenericListViewModel> ExistingObjects { get; set; } 
    public GenericCreateViewModel NewObject { get; set; 
} 

public class GenericCreateViewModel 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
} 

Nach Ansicht durch ExistingObjects ich Looping alle vorhandenen Objekte angezeigt werden, und unter Ich bin ein Formular mit @Html.BeginForm("Index", "GenericController", FormMethod.Post) Erstellen und innen Ich habe das entsprechende @Html.EditorFor(m => m.NewObject.PropertyA). Ansicht-Schnipsel unten:

@model Namespace.Models.Generic.GenericIndexViewModel 
... 
@if (Model.ExistingObjects.Any()) 
{ 
    // Display list of objects 
} 
... 
@using (Html.BeginForm("Index", "GenericController", FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 

    <div class="field-holder"> 
     @Html.LabelFor(m => m.NewObject.PropertyA) 
     @Html.EditorFor(m => m.NewObject.PropertyA) 
    </div> 

    <div class="field-holder"> 
     @Html.LabelFor(m => m.NewObject.PropertyA) 
     @Html.EditorFor(m => m.NewObject.PropertyA) 
    </div> 

    <div> 
     <input type="submit" value="Save" name="command" /> 
    </div> 
} 

Die Aktion Methodensignatur ist wie folgt:

[HttpPost] 
public ActionResult Index(GenericCreateViewModel model) { ... } 

Wenn ich das Formular abzuschicken trifft es erfolgreich die Aktion-Methode, obwohl model Parameter null ist.

Wenn ich überprüfen Sie die Post-Daten Ich kann sehen, dass sich die Eigenschaften mit NewObject voran werden:

NewObject.PropertyA=test1&NewObject.PropertyB=test2 

Wie kann ich entweder verhindern, dass das Präfix oder die Aktion-Methode erhalten Sie die Präfix Eigenschaften als Argumente zu erkennen?

+0

Was ist Ihr @Modell in Ihrer Ansicht? –

+0

Bitte zeigen Sie den notwendigen relevanten Code of view –

+0

Hinzugefügt Ansicht Snippet wie gewünscht. –

Antwort

2

Versuchen Sie, Ihre Redakteure

@Html.EditorFor(m => m.NewObject.PropertyA) 

verändern und Ihre Aktion Beitrag

[HttpPost] 
public ActionResult Index(GenericIndexViewModel model) { ... } 

zu

ändern und Zugriff dann model.NewObject die erforderliche GenericCreateViewModel zu bekommen.

Oder Sie können es versuchen, mit:

<div class="field-holder"> 
    <label>PropertyA</label> 
    <input type="text" name="PropertyA" /> 
</div> 

<div class="field-holder"> 
    <label>PropertyB</label> 
    <input type="text" name="PropertyB" /> 
</div> 
<div> 
    <input type="submit" value="Save" name="command" /> 
</div> 

und halten GenericCreateViewModel Objekt in der POST-Methode erhalten.

[HttpPost] 
public ActionResult Index(GenericCreateViewModel model) { ... } 

Dies ist nur eine Möglichkeit, um die gewünschten Ergebnisse zu erzielen.

+0

Wird nicht das gesamte 'GenericIndexViewModel' einschließlich aller 'ExistingObjects' Daten zurückgeschrieben? –

+0

Getestet und nein, es werden nur Eigenschaften innerhalb der 'BeginForm' gepostet. Danke vielmals! –

0

Das Standardverhalten des Formulars stellt das vollständige Modell zurück auf den Controller, sodass Sie den Parameter in der Post-Indexmethode einfach auf GenericIndexViewModel ändern können.

Wenn Sie die C# -Methode beibehalten möchten, müssen Sie die Art und Weise überschreiben, wie Daten formatiert sind, und die Postanforderung selbst in das Ereignis onsubmit stellen.