许多开发者这样做:
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
,但我不确定这会如何影响该过程。这样做的正确方法是什么?
答案 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
}
为什么不呢?
总结:
在ASP.NET-MVC Razor视图中,中止渲染视图/部分视图的正确方法是什么?
没有正确的方法,因为你不能这样做。视图中的代码必须呈现页面,它不必决定应将哪个页面发送给客户端。如果你正在做其他任何事情,那么你是using MVC as it shouldn't be used,那就不正确了。