2010-10-12 28 views
1

我有一个正在处理的Web应用程序,我想避免视图中if/elseif/else的混乱,并且为了有条件地包含在视图中而有太多独立的ascx文件。有没有办法阻止呈现MVC视图的纯文本部分?

我想要做的是建立某种形式的简单类的作品,像这样(的实例证实想什么,我来实现)

<% using(RequiresAccessTo.Feature(Features.FancyStuff)) { %> 
Special content for users 
<% } %> 

如果用户确实不访问该功能,该类将呈现注册链接。我知道我可以简单地使用if/else,但根据访问级别,else块的内容可以是2-3种不同的标准响应之一,并且该机制将用于网站周围的无数地方。

如果有办法简单地阻止用户的特殊内容完全呈现,这意味着我可以使网站上的模板非常易于维护。

+3

这是部分视图(即.ascx)的用途。不知道你为什么不想使用它。您可以将参数传递到分部视图,就像使用'RequiresAccessTo.Feature'示例一样。你也可以考虑编写一个扩展方法,但这需要在C#代码中进行大量的HTML生成,这通常是不可取的。 – 2010-10-12 12:56:52

+1

实际上不是局部视图吗?说你想在“某种简单的课堂上”这样做是双重行为。这正是一种观点。 – spender 2010-10-12 13:09:18

+0

@Kirk - 据我所知,在我的情况下,我最终会为每个有问题的aspx文件提供10,20,30或更多的部分视图。我正在寻找一种解决方案,它能够:(a)停止正在讨论的aspx文件被分割成大量的ascx文件,并且(b)停止代码与if/elseif/else块之间的spaghetti。 – 2010-10-12 13:54:00

回答

2

您可能尝试的另一种选择是创建自定义服务器控件。控件上的属性可能包含您想要检查权限的功能集。如果该权限未得到满足,则该控件将呈现适合该访问级别或权限的注册链接。你的意见将最终看起来像:

<controls:SignUpWrapper runat="server" id="signup" access="FancyStuff"> 
    <div> 
     Approved user contents. 
    </div> 
</controls:SignUpWrapper> 

在你的控制,你会首先检查的许可,则使无论是适当的链接或提供的HTML。这里最棘手的一点可能是获取路由信息到您的服务器控制代码。不是我试过的东西。最糟糕的情况我想你应该能够通过必要的信息,甚至通过属性的整个注册链接。没有等待,更糟的是绕过路由,强制URL通过配置值,呃......是的。无论哪种方式,它都比你想要的例子更有意思,但并不遥远。

我想有些人可能会看到,即使服务器控制思想有点过分。但只要远离视图状态,回发行为和其他一些经典的ASP.NET功能,就没有什么能够阻止使用服务器控件。我们都已经使用了主人和内容容器。对不起,如果你已经在合唱团传教。 =)

目前,这正在扩展我的想象力,甚至常识有点取决于生成该链接的难度。如果我想到其他东西,我会检查一下。

+0

嗯,那可以工作。回到ASP.Net WebForms语法虽然让我感到有点不高兴。如果有办法暂时抑制Response.Write输出,可以解决整个问题。 – 2010-10-12 15:25:49

+0

我想问题是,逻辑需要去某个地方,在这一点上,我们只是谈论很多方法来做到这一点。我曾研究过试图为MVC创建自己的'使用'友好实体/例程,类似于Html.BeginForm()机制。我认为我发现在页面上有一个特殊的考虑。虽然能写我们自己会很高兴。 – Chuck 2010-10-12 18:14:48

+0

我打算把这个标记为正确的,因为现在基本上这是最好的答案。 – 2010-10-15 21:18:02

1

我可以想到另一个不错的选择,让你的if/else逻辑保持局部视图。

您可以创建一个HtmlHelper扩展方法。 HtmlHelper是在视图中调用诸如Html.ActionLink之类的东西时使用的对象。你可以编写自己的方法来生成你想要的任何HTML。该条件语句都需要在扩展方法的地方,您的视图代码被简化为:

<%= Html.MyControl(param1, param2) %> 

拇指何时创建的HtmlHelper扩展方法决定以及何时创建的局部视图时,我遵循的规则一般是多少HTML将被生成。如果我最终得到了几行HTML格式,部分控件通常是最好的选择,因为它通常更易于理解和维护HTML。

如果您担心组织大量部分视图,则可以在共享视图目录下创建子文件夹。意见然后可以像这样引用:

<% Html.RenderPartial("Subfolder/PartialView") %> 
+0

谢谢,我已经考虑过所有这些方法。问题是单个视图将被拆分成多个不同的局部视图。我正在单独工作的人只有20-30个ascx文件。重点是基本上能够包装任意小块的内容,并且如果没有满足标准的站点范围内的条件,则替换其他内容。 – 2010-10-12 13:50:33

+0

...所以这些控件不会在任何地方重复使用,部分只会导致您的项目混乱。让我再试一次,不同的答案... – Chuck 2010-10-12 14:10:22

0

我只是想到了一个替代解决方案的:

<% if(!BlockContentAndRenderPlaceHolder(Feature.Whatever)) { %> 
whatever 
<% } %> 

我知道这看起来有点迟钝,但如果你看到这些网页上的内容, '明白。

相关问题