我有一个正在处理的Web应用程序,我想避免视图中if / elseif / else的混乱,并且只是为了条件包含在视图中而有太多单独的ascx文件。
我想要做的是创建一些像这样工作的简单类(一个例子将展示我想要实现的目标)
<% using(RequiresAccessTo.Feature(Features.FancyStuff)) { %>
Special content for users
<% } %>
如果用户不有权访问该功能,则该类会呈现注册链接。我知道我可以简单地使用if / else,但是else块的内容可能是2-3种不同的标准响应之一,具体取决于访问级别,这种机制将在网站周围的无数地方使用。
如果有办法简单地阻止用户的特殊内容完全呈现,那就意味着我可以让网站周围的模板非常容易维护。
答案 0 :(得分:2)
您可能尝试的另一个选项是创建自定义服务器控件。控件上的属性可能包括您要检查权限的功能集。如果未满足该权限,则控件将呈现适合该访问级别或权限的注册链接。您的观点最终会看起来像:
<controls:SignUpWrapper runat="server" id="signup" access="FancyStuff">
<div>
Approved user contents.
</div>
</controls:SignUpWrapper>
在您的控件中,您首先检查权限,然后呈现相应的链接或提供的HTML。这里最棘手的一点可能是将路由信息提供给服务器控制代码。不是我试过的东西。最糟糕的情况我想你应该能够通过属性传递必要的信息甚至整个注册链接。没有等待,更糟糕的是完全绕过路由并通过配置值强制URL,呃...是的。无论哪种方式,它都比你想要的例子有点晦涩,但并不遥远。
我想有些人甚至可能会看到服务器控制的想法有点不稳定。但只要您远离视图状态,回发行为以及其他一些经典的ASP.NET功能,就没有什么能阻止使用服务器控件了。我们都已经使用了主人和内容容器。如果你已经在唱诗班,很抱歉。 =)
目前,这正在拉伸我的想象力甚至常识,取决于生成该链接的难度。如果我想到别的什么,我会回来看看。
答案 1 :(得分:1)
我可以想到另一个合适的选择,让你的if / else逻辑保持在局部视图中。
您可以创建一个HtmlHelper扩展方法。 HtmlHelper是在视图中调用Html.ActionLink之类的东西时使用的对象。您可以编写自己的方法来生成所需的任何HTML。条件都发生在扩展方法中,您的视图代码将缩减为:
<%= Html.MyControl(param1, param2) %>
在决定何时创建HtmlHelper扩展方法以及何时创建局部视图时,我遵循的经验法则通常是生成多少HTML。如果我最终得到的是几行渲染的HTML,那么部分控制通常是最好的选择,因为通常更容易理解和维护HTML。
如果您担心组织大量部分视图,可以在共享视图目录下创建子文件夹。然后可以像这样引用视图:
<% Html.RenderPartial("Subfolder/PartialView") %>
答案 2 :(得分:0)
我只想到了另一种解决方案:
<% if(!BlockContentAndRenderPlaceHolder(Feature.Whatever)) { %>
whatever
<% } %>
我知道它看起来有点迟钝,但是如果你看到这些页面上的内容,你就明白了。