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

Asp.net mvc 什么';在ASP.NET MVC中处理控件显示逻辑的推荐模式是什么?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在浏览一些MVC3教程,即Pluralsight视频,我正在思考如果将现有应用程序大修为ASP.NET MVC,它将如何运行(不是计划,但它给了我一个参考框架)。在我们的aspx代码中,有相当多的代码看起来像这样: if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;} 假设这个例子大大简化了,但是假设布尔逻辑相当复杂,并且假设在使控件可见(可能更改颜色、大小、文本等)的过程

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

if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;}

假设这个例子大大简化了,但是假设布尔逻辑相当复杂,并且假设在使控件可见(可能更改颜色、大小、文本等)的过程中需要进行多种操作,那么在ASP.NET MVC中执行此操作的模式是什么?看起来你必须在视图中做同样的布尔检查,这对我来说有点难看。似乎必须有更好的方法,这肯定出现在MS的用例列表中,我只是看不到答案。

根据具体场景,您可能采取的方法会有很大差异。有几种选择包括:

  • 按照您所说的操作并在视图中添加条件
  • 将条件(如果复杂)抽象到视图模型中,使视图中的行仍然简单(只需访问视图模型上的预设布尔值)
  • 在路由或控制器级别有条件地执行此操作,并调用不同的总体视图(可能共享布局(razor)或主视图(webforms mvc))
您没有明确提到如何在条件中呈现控件。我想你会做一个渲染部分。因此,视图中的线条本身将非常“小”

if(myViewModel.ComplexBoolean) // Boolean set in generation of view model
    Html.RenderPartial('firstPartial')
else
    Html.RenderPartial('secondPartial')
编辑:如果设置为“可见”的项目只是一个控件,则可以直接输出控件,例如

if(myViewModel.ComplexBoolean) {
    Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
if(myViewModel.ComplexBoolean){
DropDownListFor(m=>m.Type,Model.Types/*An IEnumerable*/,new{@class=“myList”});
}
此外,如果您不想设置“Model.Types”属性(例如保存db命中),则条件可能位于您创建视图模型的位置(控制器或某些服务/视图模型repo)。然后,视图可以只检查属性是否存在:

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

如果控件不使用视图视图模型中的数据,也可以使用Html.RenderAction调用子操作。例如,假设您希望向具有不同角色的用户显示不同的菜单。您可以在视图中调用@{Html.RenderAction(“菜单”、“帐户”);},这将调用“帐户”控制器中的“菜单”操作。复杂的布尔逻辑和制定控制器设置的逻辑将驻留在“帐户”控制器的“菜单”操作中。“菜单”操作将决定要显示的局部视图/控制器

// 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);
    }
}

这就是我对视图块的想法,它会有条件地改变,但我更多地考虑视图中的单个控件。例如,假设我有一个列表框、一个复选框和一个文本框,每个框的可见性都是由一些独立的条件逻辑驱动的。对于多个局部视图是否存在性能开销?在这些情况下,您不必执行局部视图。我在答案中添加了一些关于策略的内容。我不知道关于性能的具体数字/可量化数据,但我认为,从逻辑上讲,越少越好。