2016-04-25 7 views
1

Ich habe eine Ansicht und in dieser Ansicht habe ich ein Div, das eine Teilansicht enthalten wird.Wie aktualisiere ich das Ansichtsmodell in einer Teilansicht in MVC5?

Mein Problem ist dies. Der Benutzer wählt ein Element aus der Dropdown-Liste und ich lade die Teilansicht mit dem Modell. Die Benutzeränderung ändert einige der Textfelder und klickt auf die Schaltfläche, um die Teilansicht (die sich in einem Html.BeginForm befindet) zu senden.

Wenn ich gehe, um das Modell in der Steuerung zu untersuchen, enthält das Modell nicht die Änderungen, die der Benutzer vorgenommen hat.

Warum spiegelt das Modell nicht die Änderungen wider, die der Benutzer vorgenommen hat?

in der Hauptansicht:

<div id="personInfo" style="display:none;"></div> 

Meine Teilansicht:

@model MyProject.MyModel 

    @(Html.Kendo().DropDownList().Name("ddlFilters") 
           .AutoBind(true) 
           .OptionLabel("--- Select Filter ---") 
           .DataValueField("ID") 
           .DataTextField("MYFILTER") 
           .DataSource(ds => 
            ds.Read(r => r.Action("GetPersonFilters", "Home")) 
           ) 
           .Events(x => x.Select("ddlFilters_onSelect")) 
         ) 

    @using (Html.BeginForm("PersonAction", "Home", FormMethod.Post, new { @class = "form-horizontal", id = "personForm" })) 
      { 
       // Strongly typed Kendo fields. Several DropDownListFor and TextBoxFor 
       @Html.Kendo().TextBoxFor(x => x.FirstName).HtmlAttributes(new { @class = "form-control kendoTextBox required " }) 
       // Button to post the form data to the controller. 
      } 

Mein Javascript:

function ddlFilters_onSelect(e) { 
    var itm = this.dataItem(e.item); 

    clearForm(); 

    if (itm.ID > 0) { 
     // Ajax call to get data.... 
     $.ajax({ 
      url: "/Home/GetPerson", 
      type: "GET", 
      data: { "myID": itm.ID } 
     }) 
     .done(function (result) { 
      //var aaa = data;  
      $("#personInfo").html(result); 
     }) 
     .fail(function (xhr, status, err) { 
      alert(xhr.responseText); 
     }); 
    } 
}; 

Modell:

public partial class MyModel 
    { 
     public decimal ID { get; set; } 
     public string FirstName{ get; set; } 
     public string LastName{ get; set; } 
     public string MiddleName{ get; set; } 
    } 

EDIT: Controller-Code:

// Initial call to main view 
    public ActionResult CreateNewPerson() 
    { 
     return View(); 
    } 

    // Call to load Partial View initially 
    public PartialViewResult GetPersonInfo() 
    { 
     return PartialView("_PersonForm", new MyModel()); 
    } 

    // Call to load partial view with data 
    public PartialViewResult GetPerson(int myID) 
    { 
     myData = GetFromDB(myID); 
     return PartialView("_PersonForm", myData); 
    } 

    // Method to save partial form 
    [HttpPost] 
    public ActionResult PersonAction(MyModel filter) 
    {   

     if (ModelState.IsValid) 
     { 
      // Go update DB 
     } 

     return View("CreateNewPerson"); 
    } 
+1

Können Sie Controller-Code eingeben? –

Antwort

0

Dies ist nicht genau das Szenario, das Sie beschrieben, aber das ist, wie mein Team nutzt partials:

1) Im Ansichtsmodell für Ihre Hauptansicht, Objekte hinzufügen (z.B MyModel) für das Modell der Teilansicht.

2) Wenn die Teilansicht in cshtml aufrufen, stellen Sie sicher, dass Sie MVC sagen, wo der Inhalt der Teilansicht zu binden:

@Html.Partial("_PersonAction", Model.MyModel, new ViewDataDictionary(Html.ViewData) { 
     TemplateInfo = new TemplateInfo { HtmlFieldPrefix = Html.NameFor(m => m.MyModel).ToString() } 
    }) 

Hinweis, wie wir die TemplateInfo verwenden Sie den richtigen Kontext für die festlegen partiell, so dass den Eingaben, die in der partiellen Darstellung gerendert werden, die korrekten Namen vorangestellt werden, damit die Modellbindung funktioniert. Z.B. <input name="MyModel.FirstName"> Sie können dies wahrscheinlich in Javascript fälschen, aber frag mich nicht wie.

3) Unsere Controller-Aktionen akzeptieren das ViewModel der Hauptseite. Die <form> ist auf der Hauptseite und umgibt den Teilanruf.

+0

Was machen Sie, wenn das Modell das erste Mal leer ist? Ich habe versucht, was Sie gesagt haben und ein MainModel mit einer Eigenschaft von MyModel erstellt. In der ersten Ansicht habe ich eine neue Instanz von MainModel erstellt und die Property MyModel initialisiert. (ie new MyModel()) Jetzt, wenn ich gehe, um die Daten zu veröffentlichen, erkennt es keine geänderten Werte. – PrivateJoker

+0

Ich vermute immer noch, dass das Problem darin besteht, dass der Name und die ID der Eingaben, die von dem Partiellen gerendert werden, nicht korrekt vorangestellt sind (Sie können dies durch Überprüfen des generierten HTML bestätigen). Kannst du versuchen, eine normale Ansicht von 'GetPerson' zurückzugeben? Hoffentlich löst dies das Problem mit den Präfixen, und Sie können Ihre ursprüngliche Code- und Modellstruktur beibehalten. –

+0

Ich bin noch neu in MVC, aber ich bin mir nicht sicher, welches Präfix zu erwarten ist? Wenn ich die Ansicht untersuche, sehe ich das Formular und seine ID und alle Felder konvertieren Eingabeelemente mit dem Namen und der ID, die auf das Feld im Modell gesetzt werden. – PrivateJoker

Verwandte Themen