C# 区域持久性边栏MVC 3
我的web应用程序中有一个区域。这个区域有几个控制器。有一个控制器处理该区域的入口(即,所有东西都通过该控制器访问该区域中的其他控制器)。此控制器需要将ID传递给操作:C# 区域持久性边栏MVC 3,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我的web应用程序中有一个区域。这个区域有几个控制器。有一个控制器处理该区域的入口(即,所有东西都通过该控制器访问该区域中的其他控制器)。此控制器需要将ID传递给操作: public ActionResult Index(Guid appID) { var vm = new DeviceManagementViewModel { SelectedApp = appID, App = _reposito
public ActionResult Index(Guid appID)
{
var vm = new DeviceManagementViewModel
{
SelectedApp = appID,
App = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(appID)),
Devices = GetDevices()
};
return View(vm);
}
它创建的视图然后用另一个ID发回。因此,现在有两个ID已经获得并在整个区域中保持
每个控制器中的每个创建、编辑和详细信息操作都需要传递这两个ID,以便显示正确的数据,例如:
public ActionResult Create(Guid appID, Guid deviceID)
{
var vm = new InputViewModel
{
Device = deviceID,
Application = appID
};
return View(vm);
}
现在,如果我能有一个侧边栏,它有到每个细节的快速链接,并用相关ID填写创建操作,那就太好了,例如:
@Html.ActionLink("Create Input Methods", "Create", "Input", new { appID = <-- ID ONE -->, deviceID = <-- ID TWO --> }, null)
这将有一个如下所示的ViewModel:
public class MenuViewModel
{
public Guid ApplicationID {get; set;}
public Guid DeviceID {get; set;}
}
和这样的局部视图:
<aside id="dashboard_menu">
<div id="extras">
<div class="oi">
<h2 class="screenreader-only">Menu</h2>
<div class="rollup section">
<h3 class="rollup-trigger">Input Methods</h3>
<p>View or Add more Input Methods</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Launch & Exit</h3>
<p>View or Add more Launch & Exit</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Performance</h3>
<p>View or Add more Performance</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Power Consumption</h3>
<p>View or Add more Power Consumption</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Qualitative Validation</h3>
<p>View or Add more Qualitative Validation</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
</div>
</div>
推出及;出口
查看或添加更多发布&;出口
演出
查看或添加更多性能
功耗
查看或添加更多功耗
定性验证
查看或添加更多定性验证
那么现在,我如何使它持久化,我是否在该区域的_Layout.cshtml中使用它?如果是,怎么做
我是否在每个查看页面中都使用它?如果是,我怎么能不这样做,因为它似乎比必要的工作更多
我所困惑的是,如何将这些ID参数传递给部分视图,以及从何处加载部分视图?因此,答案在于以下几点: 不幸的是,这是一个逐浏览页面的答案 在布局页面中定义一个部分:
@if (IsSectionDefined("SideBar"))
{
@RenderSection("SideBar")
}
else
{
<div id="extras">
<div class="oi">
<h2 class="screenreader-only">Menu</h2>
<div class="rollup section">
<h3 class="rollup-trigger">Application Validation</h3>
<p>Goto all Applications</p>
<p class="more"><a href="#">» @Html.ActionLink("All Applications", "Index", "Application", new { area = "Validation" }, null)</a></p>
</div>
</div>
</div>
}
在菜单部分视图中,将显示:
<div id="extras">
<div class="oi">
<h2 class="screenreader-only">Menu</h2>
<div class="rollup section">
<h3 class="rollup-trigger">Input Methods</h3>
<p>View or Add more Input Methods</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Launch & Exit</h3>
<p>View or Add more Launch & Exit</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Performance</h3>
<p>View or Add more Performance</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Power Consumption</h3>
<p>View or Add more Power Consumption</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Qualitative Validation</h3>
<p>View or Add more Qualitative Validation</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
</div>
菜单
输入法
查看或添加更多输入方法
推出及;出口
查看或添加更多发布&;出口
演出
查看或添加更多性能
功耗
查看或添加更多功耗
定性验证
查看或添加更多定性验证
菜单操作将与问题中的操作类似
完成了。在没有答案的情况下,它比我预期的更优雅。但这正是我所需要的。因此,答案就在于以下几点: 不幸的是,这是一个逐浏览页面的答案 在布局页面中定义一个部分:
@if (IsSectionDefined("SideBar"))
{
@RenderSection("SideBar")
}
else
{
<div id="extras">
<div class="oi">
<h2 class="screenreader-only">Menu</h2>
<div class="rollup section">
<h3 class="rollup-trigger">Application Validation</h3>
<p>Goto all Applications</p>
<p class="more"><a href="#">» @Html.ActionLink("All Applications", "Index", "Application", new { area = "Validation" }, null)</a></p>
</div>
</div>
</div>
}
在菜单部分视图中,将显示:
<div id="extras">
<div class="oi">
<h2 class="screenreader-only">Menu</h2>
<div class="rollup section">
<h3 class="rollup-trigger">Input Methods</h3>
<p>View or Add more Input Methods</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Launch & Exit</h3>
<p>View or Add more Launch & Exit</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Performance</h3>
<p>View or Add more Performance</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Power Consumption</h3>
<p>View or Add more Power Consumption</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
<div class="rollup section">
<h3 class="rollup-trigger">Qualitative Validation</h3>
<p>View or Add more Qualitative Validation</p>
<p class="more"><a href="#">» @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
<p class="more"><a href="#">» @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
</div>
</div>
菜单
输入法
查看或添加更多输入方法
推出及;出口
查看或添加更多发布&;出口
演出
查看或添加更多性能
功耗
查看或添加更多功耗
定性验证
查看或添加更多定性验证
菜单操作将与问题中的操作类似
完成了。在没有答案的情况下,它比我预期的更优雅。但这正是我所需要的。如果您需要能够为每个视图指定不同的边栏操作,那么您的解决方案将非常棒;但是,如果您需要特定于区域的侧栏,这会在每个视图中增加不必要的开销和重复,这可能会使您的解决方案在发生任何变化时难以管理 为了避免这种情况,您可以尝试为每个区域创建一个
BaseController
,用于指定边栏操作。然后,您可以确定视图中的当前区域,并使用该区域通过RenderAction
public class SomeAreaBaseController : Controller
{
public SomeAreaBaseController()
{
ViewBag.HasSidebar = true;
ViewBag.Application = ...;
ViewBag.Device = ...;
}
public ActionResult Menu(Guid appID, Guid deviceID)
{
...
}
}
现在,从该区域的其他控制器中继承:
public class SomeController : SomeAreaBaseController
然后,在Layout.cshtml
中
@if (ViewBag.HasSidebar) {
@Html.RenderAction("Menu", ViewContext.RouteData.Values["controller"],
new { appID = ViewBag.Application, deviceID = ViewBag.Device })
}
如果您需要能够为每个视图指定不同的边栏操作,那么您的解决方案将非常棒;但是,如果您需要特定于区域的侧栏,这会在每个视图中增加不必要的开销和重复,这可能会使您的解决方案在发生任何变化时难以管理 为了避免这种情况,您可以尝试为每个区域创建一个
BaseController
,用于指定边栏操作。然后,您可以确定视图中的当前区域,并使用该区域通过RenderAction
public class SomeAreaBaseController : Controller
{
public SomeAreaBaseController()
{
ViewBag.HasSidebar = true;
ViewBag.Application = ...;
ViewBag.Device = ...;
}
public ActionResult Menu(Guid appID, Guid deviceID)
{
...
}
}
现在,从该区域的其他控制器中继承:
public class SomeController : SomeAreaBaseController
然后,在Layout.cshtml
中
@if (ViewBag.HasSidebar) {
@Html.RenderAction("Menu", ViewContext.RouteData.Values["controller"],
new { appID = ViewBag.Application, deviceID = ViewBag.Device })
}
模型来自哪里?布局没有从菜单ActionGood question返回的MenuViewModel的模型。我忽略了这一点,但我个人认为,对于如此简单的参数,最好在每次请求时使用您通常使用的任何方法将它们添加到ViewBag中,并从视图中检索它们。如果您的操作开始需要更复杂的模型,您可以在
BaseController
中显式创建此模型,并将ViewBag.SomeModel
传递到RenderAction