2013-04-16 2 views
5

Ich versuche, einige MVC4-Ansichten in jQuery-Registerkarten anzuzeigen. Hier ist mein Code:jQuery-Registerkarten mit MVC4-Inhalt

Das Problem ist, dass der Inhalt der ersten Registerkarte nur gut angezeigt wird - aber die zweite ist leer. Es scheint, dass die Teilansicht nicht gerendert wird.

Gibt es eine Möglichkeit, entweder jQuery-Registerkarten zu zwingen, Inhalt für ALLE Registerkarten zu aktualisieren, wenn die Seite geladen wird, oder eine Möglichkeit, meine partielle Ansicht beim Laden der Seite zu rendern?

+1

Sie sollten ActionResults für diejenigen aufrufen, die die Ansichten nicht direkt einspeisen. Das ist wahrscheinlich der Grund, warum es nicht für Sie funktioniert, weil es nicht im Kontext des Frameworks ausgeführt wird. –

+0

Ja, ich habe das mit jQuerys load ('AppOne') gemacht. Das hat funktioniert, aber ich hatte Probleme mit dem Javascript. Es funktioniert auch mit den in ajax loader eingebauten Registerkarten, aber die Registerkarte wird mit jedem Klick neu geladen und verliert Formulardaten. Zwischenspeichern der Registerkarten schien nicht zu funktionieren. – Nicros

+1

Wenn sie jeweils eigene Modelle haben, müssen Sie einfach RenderAction anstelle von RenderPartial verwenden. Auf diese Weise können Sie ihnen jeweils ein eigenes Modell zuführen, das sie erwarten. Indem Sie es so machen, wie Sie es haben, werden beide im Kontext des Modells wiedergegeben, das Sie in dieser Ansicht haben. –

Antwort

4

Hier ist Code, den ich aktiv bin daran arbeiten arbeitet gerade fein:

Login.cshtml

@{ 
    AjaxOptions optsLogin = new AjaxOptions { UpdateTargetId = "login-tab-login" }; 
    AjaxOptions optsRegister = new AjaxOptions { UpdateTargetId = "login-tab-register" }; 
} 
<section id="login-tabs"> 
    <ul> 
     <li><a href="#login-tab-login">Returning Customers</a></li> 
     <li><a href="#login-tab-register">New Customers</a></li> 
    </ul> 
    @using (Ajax.BeginForm("Login", "Account", optsLogin, new { id = "form-login" })) 
    { 
     <div id="login-tab-login"> 
      @Html.Partial("Account/_Login") 
     </div> 
    } 
    @using (Ajax.BeginForm("Register", "Account", optsRegister, new { id = "form-register" })) 
    { 
     <div id="login-tab-register"> 
      @Html.Partial("Account/_Register") 
     </div> 
    } 
</section> 
<script type="text/javascript"> 
    $(function() { 
     $('#login-tabs').tabs(); 
    }); 
</script> 

Meine Teilansichten sind im freigegebenen Ordner in einem Unterordner Konto. Zusätzlich hat jede Teilansicht ein eigenes Modell. Other than that, ist die Umsetzung nichts Besonderes ...

UPDATE

I-Code hinzugefügt haben Ajax fordert die beiden Laschen zu implementieren. Der Codeblock über dem Registerkartenabschnitt enthält die AjaxOptions Objekte für die zwei <form> Elemente. Ihr Controller muss so etwas wie folgt aussehen:

AccountController.cs

public class AccountController : Controller 
{ 
    ... 
    [HttpGet] 
    public ActionResult Login() 
    { 
     ... 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Login(LoginModel model) 
    { 
     ... 
     if (ModelState.IsValid) 
      return RedirectToAction("Index", "Home") 
     else 
      return PartialView("/Account/_Login", model); 
    } 

    [HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     ... 
     if (ModelState.IsValid) 
      return RedirectToAction("Index", "Home") 
     else 
      return PartialView("/Account/_Register", model); 
    } 
} 

Die Login GET Aktionsmethode macht die gesamte Seite einschließlich der _Layout.cshtml und _ViewStart.cshtml Ansichten. Meine Teilansichten, _Login.cshtml und _Register.cshtml, enthalten die HTML-Elemente für die Eingabeformulare. Jede Teilansicht hat seine eigene Taste einreichen:

<input type="submit" value="<Whatever you want to display>" /> 

Da jede Teilansicht Anruf in seinem eigenen using (Ajax.BeginForm(...)) Block eingeschlossen ist, und ich habe jedes <form> sein eigenes id Attribut gegeben, kann ich JavaScript-Code kapern das submit Ereignis hinzuzufügen. Abhängig davon, welche Taste submit gedrückt wird, führt es die Aktionsmethode aus, die der angegebenen Aktion und dem Controller im Ajax.BeginForm(...)-Aufruf zugeordnet ist. In meinem Fall, wenn die Formulardaten die Validierung bestehen, wird der Controller automatisch zu /Home/Index umleiten.

Wenn jedoch die Validierung fehlschlägt, wird die Aktion-Methode einfach die gerenderte Version meiner Teilansicht an den Browser zurückzuschicken und es in dem Elemente in der UpdateTargetId Eigenschaft in dem mit den <form> zugeordnet AjaxOptions Objekt angegeben platzieren. Da die Standardeinstellung InsertionModeReplace ist, wird die View-Engine einfach die alte Version der Teilansicht durch die neue Version ersetzen, komplett mit Formulardaten und Validierungsnachrichten, falls vorhanden.

Die einzigen Code-bezogenen Elemente, die ich nicht enthalten habe, sind meine Teilansichten, die wirklich keine Rolle spielen, soweit die jQuery Tabs Funktionalität geht. Ich habe kein zusätzliches JavaScript in meinen Teilansichten, und der zusätzliche Code in AccountController, den ich nicht einbezogen habe, ist spezifisch für den Aufruf meiner externen Web-API-Konsolenanwendung und das Festlegen des Berechtigungscookies. Ich verwende Google CDN für meine jQuery- und jQuery UI-Deklarationen, anstatt das JavaScript lokal zu hosten.

Es dauert eine Weile, um den Kopf herumzulegen, was Sie tun müssen. Sobald Sie es aber haben, haben Sie es und das Wissen ist übertragbar. Dies ist nicht WebForms, Gott sei Dank.

+0

Sie verwenden jQuery-Registerkarten? Etwas Vorstellungskraft dort tun? Und dein zweiter Tab zeigt sich gut? Es muss etwas anderes für mich vorgehen, wenn das für dich funktioniert. Ich werde das überprüfen. – Nicros

+0

Ich habe meinen jQuery-Aufruf zu dem vorhandenen Code hinzugefügt, aber das ist alles, was Sie brauchen, um die Registerkarten zum Laufen zu bringen. Wenn jeder Tab ein Formular darstellen soll, was ich mache, müssen Sie jeden DIV in einen using-Block umbrechen, der Ajax.BeginForm (...) aufruft. Sie müssen nur sicherstellen, dass Sie eine Aktionsmethode im Controller für jede Formularaktion haben, die aufgerufen wird. –

+0

Meine Tabs funktionieren ... nur kein Inhalt in diesem zweiten Tab - obwohl ich weiß, dass es außerhalb der Tabs oder im ersten Tab gut funktioniert. Mein Code auf der Seite des Rasiermessers sieht genauso aus wie deins ... obwohl ich nicht sicher bin, was du damit meinst, wenn du jeden DIV in einen Benutzungsblock einpackst, der Ajax.BeginForm aufruft ... vielleicht ist es das, was ich vermisse. – Nicros