ASP.NET MVC中处理控件显示逻辑的推荐模式是什么?
我正在浏览一些MVC3教程,即Pluralsight视频,我正在考虑如果我们现有的应用程序在ASP.NET MVC中被彻底检查时会如何工作(不是计划,但它给了我一个框架的参考)。我们有相当多的代码,看起来我们的ASPX代码屁股是这样的:ASP.NET MVC中处理控件显示逻辑的推荐模式是什么?
if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;}
诚然,例如被大大简化,但假设布尔逻辑是相当复杂的,假设多的事情需要发生,因为部分使控件可见(可能会改变颜色,大小,文本等)ASP.NET MVC中这样做的模式是什么?看起来你必须在视图本身中进行相同的布尔检查,这对我来说似乎很丑陋。似乎有必要有一个更好的方法,这肯定出现在MS的用例列表中,我只是没有看到答案。
您可能采取的方法会因具体情况而有很大差异。有几个选项incude:
- 视图
- 抽象的条件(如果是复杂的)到您的视图模型做如你所说,加入条件,这样在视图中的线路仍然简单(只在视图模型上访问预设的布尔值)。
- 这样做的条件在路由或控制器级别,并呼吁不同的整体视图(可共享一个布局(剃刀)或母版视图(WebForms的MVC))
你没有明确提到你将如何呈现条件中的控件。我假设你会做一个RenderPartial。因此,视图中的线条本身就相当“小”。
if(myViewModel.ComplexBoolean) // Boolean set in generation of view model
Html.RenderPartial('firstPartial')
else
Html.RenderPartial('secondPartial')
EDIT:如果设置为“可见”的项目仅仅是一个单一的控制你可能只是输出的控制例如直接
if(myViewModel.ComplexBoolean) {
Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
此外,如果你不想设置“Model.Types”属性(保存例如DB命中),则该条件可能在的位置创建您的视图模型(控制器或一些服务/视图模型回购)。那么该视图可以只检查属性实存改为:
if(Model.Types != null) {
Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
如果你的控件中不使用你的视图的视图模型中的数据,也可以使用Html.RenderAction调用儿童动作。例如,假设您想为具有不同角色的用户显示不同的菜单。您可以在您的视图中拨打@ {Html.RenderAction(“Menu”,“Account”);},这将在您的“账户”控制器中调用“菜单”操作。您复杂的布尔逻辑和制定控制器设置的逻辑将驻留在“账户”控制器的“菜单”操作中。 “菜单”操作将决定要显示的部分视图/控制器。
// This goes in your View (clean single line!)
@{Html.RenderAction("Menu", "Account");}
// This goes in your controller
[ChildActionOnly]
public ActionResult Menu()
{
bool isAdmin = false;
// Your complex boolean logic goes here
// Set your controller settings here
string controllerSettings = ""; // Use class or array for multiple settings
if (isAdmin)
{
return PartialView("~/Views/Account/_AdminMenu.cshtml", controllerSettings);
}
else
{
return PartialView("~/Views/Account/_StandardMenu.cshtml", controllerSettings);
}
}
这就是我在考虑有条件变化的视图块,但我在考虑更多的视图中的单个控件。例如,假设我有一个列表框,一个复选框和一个文本框,并且每个框架的可见性都由一些独立的条件逻辑驱动。是否有多个部分视图的性能开销? – 2011-05-23 10:48:29
在这些情况下,您不一定会进行部分视图。我在那里添加了一些关于策略的内容。我不知道关于表现的具体数字/可量化数据,但我会通过一种逻辑推测,越少越好。 – Cargowire 2011-05-24 08:49:31
很酷,感谢您的信息。 – 2011-06-02 00:33:40