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 InsertionMode
Replace
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.
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. –
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
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. –