我正在阅读一些MVC3教程,即Pluralsight视频,我正在考虑如果对ASP.NET MVC进行大修,我们现有的应用程序将如何运行(不是计划,但它给了我一个参考框架) ).在我们的aspx代码隐藏中,我们有相当多的代码看起来像这样:
if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;}
假设该示例大大简化,但假设布尔逻辑相当复杂并且假设需要发生多个事情作为使控件可见(可能更改颜色,大小,文本等)的一部分,那么在ASP中执行此操作的模式是什么. NET MVC?看起来你必须在视图本身做同样的布尔检查,这对我来说似乎有些难看.似乎必须有一个更好的方法,这肯定出现在MS的用例列表中,我只是没有看到答案.
解决方法
您可能采取的方法将根据具体情况而有很大差异.一些选择包括:
>按照您的说法进行操作并在视图中添加条件
>将条件(如果它很复杂)抽象到视图模型中,以便视图中的线仍然很简单(只需访问视图模型上的预设布尔值).
>在路由或控制器级别执行此条件并调用不同的整体视图(可以共享布局(剃刀)或主视图(webforms mvc))
您没有明确提到如何在条件中呈现控件.我假设你会做一个RenderPartial.所以视图中的线条本身就很“小”.
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" }); }
另外,如果您不想设置’Model.Types’属性(例如保存数据库命中),则条件可能位于您创建视图模型的位置(控制器或某些服务/视图模型存储库) .然后,视图可以检查存在的属性:
if(Model.Types != null) { Html.DropDownListFor(m => m.Type,new { @class = "myList" }); }