MVC - 视图逻辑,子进程,部分视图或单独部分的正确位置

时间:2013-03-05 11:57:57

标签: c# asp.net-mvc asp.net-mvc-4

我一直在阅读众多博客,并试图确定从模式和实践到绩效的最佳方法。

选项1 我有一个部分视图Index.cshtml与以下..

@if (Model.SomeBooleanProperty)
{
     <div>A chunk of HTML</div>
}

选项2 我有一个部分视图Index.cshtml与以下..

@Html.Partial("SomeBooleanProperty", Model)

并且该局部视图具有布尔逻辑。

@if (Model.SomeBooleanProperty)
{
     <div>A chunk of HTML</div>
}

选项3 我有一个部分视图Index.cshtml与以下..

@Html.Action("AControllerMethod", "Controller", Model)

和AControllerMethod如下

[ChildActionOnly]
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult AControllerMethod(SomeModel model)
{
   if (model.SomeBooleanProperty)
   {
    return View(model);
   }
   else
   {
        return new ContentResult() { Content = String.Empty };
        //return null
   }
}

然后返回的部分将如下(无条件逻辑)

<div>A chunk of HTML</div>
从备受关注的角度看,选项3对我来说似乎是最好的,因为我在视图中没有逻辑,但是在我看来它也是一种反模式,因为它肯定会影响性能,因为我一直在阅读博客说儿童行为影响表现。

感谢任何帮助。 Ĵ

1 个答案:

答案 0 :(得分:2)

在我看来,这取决于你需要相同输出的其他地方。

如果您要在网站的其他部分重新使用该模型的显示逻辑,那么有一个包含if语句/标记的部分视图是有意义的,然后在任何地方调用@Html.Partial("SomeBooleanProperty", Model)需要显示局部视图。

例如,如果您只在一个页面上添加此逻辑,则只需在主视图中使用if语句/标记,因为不需要将其分开。

我不会使用选项3来控制显示逻辑,因为视图逻辑在视图中执行条件逻辑没有问题。

选项3将简化您的视图模型,这意味着您不必将所有必需的数据传递到父视图中,但是会有一个性能开销调用所需的控制器。