中止/跳过/取消Razor视图的渲染

时间:2014-09-09 10:56:59

标签: asp.net asp.net-mvc razor

许多开发者这样做:

public void foo() {
  if (flag) {
    // do stuff
  }
}

我更喜欢“早退”,所以请改为:

public void foo() {

  if (!flag) return;

  // do stuff

}

在ASP.NET-MVC Razor视图中,中止/跳过/取消渲染视图/部分视图的正确方法是什么?例如,我该如何转换它:

@if (flag) {
  // do stuff
}

这样的事情:

@if (!flag) { /* what do I do here to abort/skip/cancel the rendering? */ }

// do stuff

我已尝试使用return并使用Request,但我不确定这会如何影响该过程。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:20)

正如我上面提到的,您只需发出return

我记得cshtml文件是在运行时编译的,其中包括所有内联代码以及静态html。这意味着理论上,我希望任何代码都保持原样,不会以任何方式进行转换。

所以,如果你这样做:

@if (!flag) { return; }

// do stuff

按预期工作(至少对我而言)。我只是想知道这是否会导致任何意想不到的副作用。

答案 1 :(得分:4)

如果使用" abort" ,则表示您希望根据该标记排除某些内容,那么您无需执行任何操作,只需使用if来划分这些部分(最终甚至可能是从那一行到文件末尾)。像这样:

 @if (Model.User.HasEditingPrivileges)
 {
     <input type="button" id="edit" value="Edit"/>
 }

很快就会变得难以理解,因此您可以使用部分视图(特别是如果您必须包含/排除的块很大):

 @if (Model.User.HasEditingPrivileges)
 {
     Html.RenderPartial("EditSection");
 }

如果您需要删除/跳过/取消页面创建(例如重定向到另一个页面或显示完全不同的内容),请执行以下操作:

@if (!Model.User.hasEditingPrivileges)
{
    // Ooops, he shouldn't see this page, go back to Home!
}

然后你在错误的地方进行检查。在您的控制器中执行此操作,它会选择正确的视图,并且视图不会意识到这样的逻辑:

public ActionResult View(int id)
{
    if (HasUserEditingPrivileges)
        return View("Edit", new MyModel(id));

    return Redirect("UnauthorizedAccess"); // Oops, something went wrong
}

为什么不呢?

  • 因为观点不应该知道这样的逻辑。如果您需要类似的东西(CGI,如顺序流程),那么您不应该使用MVC,因为它增加了您不需要的复杂性。
  • 因为你不能(除非有人找到一个可怕的肮脏的黑客伎俩)。 MVC的结构是在必须显示页面时构建页面(控制器决定哪个页面和哪些数据)。当这个建筑开始时,需要输出(除非你抛出异常来发出错误信号,但你应该真的避免异常来处理程序流然后...)。对于小ifs,你可以简单地使用第一个提到的方法。

总结:

  

在ASP.NET-MVC Razor视图中,中止渲染视图/部分视图的正确方法是什么?

没有正确的方法,因为你不能这样做。视图中的代码必须呈现页面,它不必决定应将哪个页面发送给客户端。如果你正在做其他任何事情,那么你是using MVC as it shouldn't be used,那就不正确了。