在 ASP.NET MVC 中处理控件显示逻辑的推荐模式是什么?

Sha*_*ard 5 asp.net-mvc asp.net-mvc-3

我正在浏览一些 MVC3 教程,即 Pluralsight 视频,我正在考虑如果我们现有的应用程序被改造为 ASP.NET MVC(不是计划,但它给了我一个参考框架) )。在我们的 aspx 代码隐藏中,我们有相当多的代码看起来像这样:

if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;}
Run Code Online (Sandbox Code Playgroud)

当然,该示例已大大简化,但假设布尔逻辑相当复杂,并假设需要发生多种事情作为使控件可见(可能更改颜色、大小、文本等)的一部分,在 ASP 中执行此操作的模式是什么? NET MVC?似乎您必须在视图本身中进行相同的布尔检查,这对我来说似乎有点难看。似乎必须有更好的方法,这肯定出现在 MS 的用例列表中,我只是没有看到答案。

Car*_*ire 4

根据具体情况,您可能采取的方法会有很大差异。一些选项包括:

  • 按照你说的做并在视图中添加条件
  • 将条件(如果很复杂)抽象到视图模型中,以便视图中的行仍然简单(只需访问视图模型上的预设布尔值)。
  • 在路由或控制器级别执行此条件并调用不同的整体视图(可能共享布局(razor)或主视图(webforms mvc))

您没有明确提及如何在条件中呈现控件。我假设你会做一个 RenderPartial。因此视图中的线条本身会非常“小”。

if(myViewModel.ComplexBoolean) // Boolean set in generation of view model
    Html.RenderPartial('firstPartial')
else
    Html.RenderPartial('secondPartial')
Run Code Online (Sandbox Code Playgroud)

编辑:如果您设置为“可见”的项目只是一个单独的控件,您可以直接输出该控件,例如

if(myViewModel.ComplexBoolean) {
    Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您不想设置“Model.Types”属性(例如保存数据库命中),则条件可能位于您创建视图模型的位置(控制器或某些服务/视图模型存储库) 。然后视图可以只检查属性是否存在:

if(Model.Types != null) {
    Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
Run Code Online (Sandbox Code Playgroud)