带有MVC4内容的jQuery选项卡

Nic*_*ros 5 jquery jquery-tabs asp.net-mvc-4 asp.net-web-api

我试图让一些MVC4视图显示在jQuery选项卡中.这是我的代码:

<div id="tabs">
    <ul>
        <li><a href="#appone">App One</a></li>
        <li><a href="#apptwo">App Two</a></li>
    </ul>
    <div id="appone">
        @{ Html.RenderPartial("~/Views/AppOne/Index.cshtml"); }
    </div>
    <div id="apptwo">
        @{ Html.RenderPartial("~/Views/AppTwo/Index.cshtml"); }
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

问题是第一个标签内容显示正常 - 但第二个是空的.似乎部分视图没有呈现.

有没有办法强制jQuery选项卡在加载页面时更新所有选项卡的内容,或者强制我的局部视图在页面加载时呈现?

Nei*_* T. 4

这是我正在积极开发的代码,运行良好:

登录.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>
Run Code Online (Sandbox Code Playgroud)

我的部分视图位于帐户子文件夹中的共享文件夹中。此外,每个局部视图都有自己的模型。除此之外,实现没有什么特别的......

更新

我添加了代码来在两个选项卡上实现 Ajax 调用。选项卡部分上方的代码块保存AjaxOptions两个<form>元素的对象。你的控制器需要看起来像这样:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

操作Login GET方法呈现整个页面,包括_Layout.cshtml_ViewStart.cshtml视图。我的部分视图_Login.cshtml_Register.cshtml包含条目表单的 HTML 元素。每个部分视图都有自己的提交按钮:

<input type="submit" value="<Whatever you want to display>" />
Run Code Online (Sandbox Code Playgroud)

因为每个分部视图调用都包含在自己的using (Ajax.BeginForm(...))块中,并且我已经为每个部分视图调用提供了<form>自己的id属性,所以我可以添加 JavaScript 代码来劫持submit事件。根据submit按下的按钮,它将执行与调用中指定的操作和控制器关联的操作方法Ajax.BeginForm(...)。就我而言,如果表单数据通过验证,控制器将自动重定向到/Home/Index.

但是,如果验证失败,操作方法将简单地将分部视图的渲染版本发送回浏览器,并将其放置UpdateTargetIdAjaxOptions<form>. 由于默认值为InsertionModeReplace视图引擎将简单地将旧版本的部分视图替换为新版本,并包含表单数据和验证消息(如果包含)。

我唯一没有包含的与代码相关的项目是我的部分视图,就 jQuery 选项卡功能而言,这实际上并不重要。我的部分视图中没有任何额外的 JavaScript,并且AccountController我未包含的额外代码专门用于调用我的外部 Web API 控制台应用程序并设置授权 cookie。我使用 Google 的 CDN 进行 jQuery 和 jQuery UI 声明,而不是在本地托管 JavaScript。

你需要花一些时间来思考你必须做的事情。然而,一旦你掌握了它,你就掌握了它,并且知识是可以转移的。感谢上帝,这不是WebForms