我只是想知道,如果将复杂的if if语句和后面的html标记移动到后面的代码中会违反某些“MVC”法则吗?

当遇到内联if if语句时,它似乎是一个很好的选择,可能变得非常难以理解。

有帮助吗?

解决方案

我不想在我的视图中使用类后面的代码。这不是因为它默认违反MVC,而是因为我发现<!> quot; natural <!> quot;方式(至少对我而言)是不同的。

当我面对与纯视图问题相关的复杂HTML标记时,我通常会为HtmlHelper类编写扩展方法以隐藏复杂性。因此我有Html.MoneyTextBox()Html.OptionGroup()Html.Pager<T>等扩展名。

在出现复杂情况的其他情况下,通常我会错过控制器中的某些内容。例如,与元素的可见性,只读或启用相关的所有问题通常都源于控制器可以提供的内容。在这种情况下,我不是将模型传递给视图,而是创建一个视图模型,它封装模型和控制器可以提供的附加信息,以简化HTML标记。视图模型的典型示例如下:

public class CustomerInfo
{
  public Customer Customer { get; set; }
  public bool IsEditable { get; set; }  // e.g. based on current user/role
  public bool NeedFullAddress { get; set; }  // e.g. based on requested action 
  public bool IsEligibleForSomething { get; set; }  // e.g. based on business rule
} 

也就是说,背后的代码是视图的一部分,因此如果它更符合您的需求,您可以自由使用它。

其他提示

你认为有条件限制并不可怕。我会把它们放在ASPX中而不是后面的代码中。但是,条件通常表示控制行为。请考虑以下ASPX代码:

<%if (ViewData["something"] == "foo") {%>
     <%=Html.ActionLink("Save", "Save") %> 
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
     <%=Html.ActionLink("Delete", "Delete") %> 
<%}%>

这组条件表示由视图处理的控制行为 - 即,在错误的位置。此行为不是单元可测试的。请考虑一下:

<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
     <%=Html.ActionLink(command) %>
<%}%>

在此示例中,ActionLink是HtmlHelper的自定义扩展,它使用我们自己的ICommand规范对象。呈现此视图的控制器操作会根据各种条件填充ViewData [<!> quot; commands <!> quot;]。换句话说,控制器进行控制。在此操作的单元测试中,我们可以测试在各种条件下将显示正确的命令集。

首先,与快速投入一些IF进入视图相比,这似乎很麻烦。你要问自己的问题是,<!>这个IF是否代表控制行为,我是否想确保在某些时候没有中断?<!>

我相信只要它是一个渲染代码并且它在<!>“View <!>”中;不在控制器中,然后将它放在后面或内联的代码上并不重要。只要确保你没有在Controllers动作中编写这段渲染代码(这样你就会违反MVC模式)。

代码隐藏是View的一部分 - 如果您想直接或在代码隐藏中将内容放在ASPX中,这取决于您。 MVC并不意味着你必须在ASPX中编写所有丑陋的东西:)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top