這裏的代碼,我積極工作是工作得很好:
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>
我的部分觀點是在一個帳戶子文件夾的共享文件夾。另外,每個局部視圖都有自己的模型。除此之外,實施是沒有什麼特別的...
UPDATE
我已經添加代碼來實現Ajax的兩個標籤調用。標籤部分上方的代碼塊包含兩個<form>
元素的AjaxOptions
對象。你的控制器需要看起來像這樣:
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);
}
}
的Login GET
行動方法呈現的整個頁面,包括_Layout.cshtml
和_ViewStart.cshtml
意見。我的部分視圖_Login.cshtml
和_Register.cshtml
包含條目表單的HTML元素。每個局部視圖都有自己的提交按鈕:
<input type="submit" value="<Whatever you want to display>" />
因爲每個局部視圖調用是在它自己的using (Ajax.BeginForm(...))
塊包裹,我已經給每個<form>
自己的id
屬性,我可以添加JavaScript代碼劫持submit
事件。根據按下哪個submit
,它將執行與Ajax.BeginForm(...)
調用中的指定操作和控制器關聯的操作方法。就我而言,如果表單數據通過驗證,控制器將自動重定向到/Home/Index
。
然而,如果驗證失敗,操作方法簡單地將我的部分觀點的渲染過的版本發送回瀏覽器,並將其放置在與<form>
相關的AjaxOptions
對象在UpdateTargetId
屬性指定的元素。由於默認InsertionMode
爲Replace
,所以視圖引擎將簡單地用新版本替換舊版本的部分視圖,如果包含表單數據和驗證消息(如果包括的話)。
我沒有包含的唯一與代碼相關的項目是我的部分視圖,對於jQuery選項卡功能而言,這並不重要。我在部分視圖中沒有任何其他JavaScript,並且我沒有包含的AccountController
中的其他代碼特定於調用我的外部Web API控制檯應用程序並設置授權cookie。我將Google的CDN用於我的jQuery和jQuery UI聲明,而不是在本地託管JavaScript。
需要一段時間才能將自己的頭圍繞在你必須做的事情上。一旦你掌握了它,但你已經掌握了它,知識是可以轉讓的。這是不是 WebForms,謝天謝地。
你應該爲那些調用ActionResults,而不是直接提供視圖。這可能是爲什麼它不適合你,因爲它沒有在框架的上下文中執行。 –
是的,我正在使用jQuerys加載('AppOne')。這工作,但我有問題的JavaScript。它也與ajax加載器中構建的選項卡一起使用,但該選項卡每次點擊都會重新加載,從而丟失了表單數據。緩存標籤似乎沒有工作。 – Nicros
如果他們各自擁有自己的模型,則只需使用RenderAction而不是RenderPartial。這樣你就可以爲他們提供他們所期待的他們自己的模型。按照你所擁有的方式,它們都是在這個視圖中的模型背景下渲染的。 –