我想创建一个类似于 Stack Overflow 上的用户页面的布局,其中页面顶部有一个视图(父视图),然后是选项卡中的内容,每个都有自己的视图(子视图)。
当我将鼠标悬停在 SO 中“用户”页面上的每个选项卡上时,它们看起来像是指向用户控制器,并被发送到查询字符串中的选项卡名称以呈现适当的选项卡内容。
我相信我可以使用在父视图中定义的部分的布局来实现这一点。该部分将是子视图,但我不知道如何告诉该部分显示哪个视图或部分视图。
我无法在网上找到任何有用的东西。有人可以告诉我如何做到这一点,或者至少为我指明正确的方向吗?
提前致谢!
编辑:感谢@Mystere 的帮助,我能够想出下面的解决方案,以防其他人尝试做同样的事情。
高温高压
最终解决方案:
控制器动作
public ActionResult Details(int id, string tab = null)
{
ViewBag.Jobid = id;
ViewBag.Tab = tab ?? "Services";
var viewModel = getJobRecordDetails(id);
return View(viewModel);
}
public ActionResult JobInfo(int id, string tab)
{
ViewBag.Jobid = id;
ViewBag.Tab = tab;
if (tab == "Services")
{
var viewModel = getServices(id);
return View("Services", viewModel);
}
if (tab == "Equipment")
{
var viewModel = getEquipment(id);
return View("Equipment", viewModel);
}
if (tab == "Personnel")
{
var viewModel = getPersonnel(id);
return View("Personnel", viewModel);
}
return View("Error");
}
父视图
@model MyApplication.Models.JobViewModel
@{
ViewBag.Title = "Details";
}
<h2>Job Details</h2>
...
@* Child View Action *@
@Html.Action("JobInfo", new { id = ViewBag.Jobid, tab = ViewBag.Tab })
子视图
@model MyApplication.Models.ServicesViewModel[]
@{
ViewBag.Title = "Services";
Layout = null;
}
@* Submenu Navigation *@
@{
Html.RenderPartial("SubMenu");
}
<h2>Services</h2>
Services here...
子导航部分视图
<div id="submenucontainer">
<ul id="submenu">
<li class="@Html.ActiveTab("Job","JobInfo","Services")"><a href="@Url.Action("Details", "Job", new { id = @ViewBag.Jobid, tab = "Services" })">Services</a> </li>
<li class="@Html.ActiveTab("Job","JobInfo","Equipment")"><a href="@Url.Action("Details", "Job", new { id = @ViewBag.Jobid, tab = "Equipment" })">Equipment</a></li>
<li class="@Html.ActiveTab("Job","JobInfo","Personnel")"><a href="@Url.Action("Details", "Job", new { id = @ViewBag.Jobid, tab = "Personnel" })">Personnel</a></li>
</ul>
ActiveTab 助手
public static string ActiveTab(this HtmlHelper helper, string controller, string action, string tab)
{
var classValue = "";
var currentController =
helper.ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString();
var currentAction =
helper.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString();
var currentTab = helper.ViewContext.Controller.ValueProvider.GetValue("tab").RawValue.ToString();
if (currentController == controller && currentAction == action && currentTab == tab)
classValue = "selected";
return classValue;
}