2016-05-12 6 views
2

Ich habe cshtml Seite. Auf der Seite habe ich Details<div> Tag. Ich beziehe dieses div-Tag, indem ich Ajax-Abfragen mache und eine Teilansicht innerhalb dieses div-Tags anfüge. Das funktioniert gut.Asp.Net Ajax: Wie man auf der gleichen Seite bleibt, ohne dynamisch hinzugefügte Kontrollen zu verlieren?

Dann im Einreichen des gesamten Formulars mit Ajax Helfer. Wenn der Modellstatus auf dem Server ungültig ist, möchte ich auf der gleichen Seite bleiben, damit die Fehlermeldung auf der Seite angezeigt werden kann. Allerdings entfernt dies jeden HTML-Code, der innerhalb des div-Tags hinzugefügt wurde.

cshtml

@using (Ajax.BeginForm("Create", "Campaign", new AjaxOptions { HttpMethod = "POST" })) 
{  
*** some html here **** 


<button class="btn btn-default" id="AddNewRow" type="button">Add New Row</button> 
<div id="Details"></div> 
<button type="submit" class="btn btn-default">Submit</button> 
} 

Javascript

$("#AddNewRow").click(function() { 
     $.ajax({ 
      cache: false, 
      async: false, 
      url: someurl 
     }).success(function (partialView) { 
      $("#Details").append(partialView); 
     });   
    }); 

-Controller

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(CampaignVM model) 
    { 
     if (!ModelState.IsValid) 
     { 
      //What should i return here so error will show on the same page and also keeps the rows i added using ajax 
      //if i do 'return View("Create",model)' then all the details row i created using ajax query gets removed 
     } 

     return RedirectToAction("Index", "Home"); 
    } 
+0

Sie scheinen zu missverstehen, was Ajax ist. Es bleibt immer auf der gleichen Seite und wird nie umgeleitet (mit einem 'return RedirectToAction (" Index "," Home ");' ist sinnlos, wenn Sie einen Ajax-Anruf machen). Sie haben noch nicht einmal 'AjaxOptions' angegeben (z. B. für die Ziel-ID, die aktualisiert werden soll), daher ist unklar, wo der Sinn dahinter liegt. Wenn Sie es umleiten, weil Sie 'jquery.unobtrusive-ajax.js' nicht eingeschlossen haben und daher eine normale Übermittlung vornehmen. –

Antwort

0

Im Rahmen des Modells für dieses Seite, enthalten Sie eine Liste von dem, was das Teilmodell ist. List<MyPartialModel> oder was auch immer.

In der Hauptansicht, wenn die Seite gerendert wird, Schleife über alle MyPartialModel in der Sammlung und rendern sie.

Dies bedeutet, dass alle Teilmodelle, die zurückgegeben werden, wenn der ModelState nicht gültig ist, erneut gerendert werden.

Sie müssen jedoch mit der Namensgebung vorsichtig sein. Wenn Ihr MyPartialModel eine Eigenschaft Telephone (zum Beispiel) hat, dann wird jedes Element in der Sammlung MyPartialModel[0].TelephoneMyPartialModel[1].Telephone usw. benannt. Dies muss getan werden, wenn das Teil der Ansicht an erster Stelle hinzugefügt wird (IIRC), so dass das Model Binder weiß dass sie Teil einer Sammlung sind.

Ich könnte etwas mit der Syntax (Eingabe aus dem Speicher) sein, aber das ist die Grundidee.

In Bezug auf was Sie in Ihrem Controller tun sollten, wenn der ModelState nicht gültig ist - einfach die Ansicht mit return View() zurückgeben. Alle Formulardaten, die eingereicht wurden, werden in ModelState gespeichert und automatisch an die Ansicht zurückgegeben. Es liegt nun an Ihnen, sie erneut zu rendern (durch Wiederholen der Sammlung).