Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法阻止MVC视图的纯文本部分进行渲染?_C#_Asp.net Mvc - Fatal编程技术网

C# 有没有办法阻止MVC视图的纯文本部分进行渲染?

C# 有没有办法阻止MVC视图的纯文本部分进行渲染?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个正在开发的web应用程序,我希望避免视图中if/elseif/else的混乱,避免视图中有太多单独的ascx文件只是为了有条件地包含在视图中 我想做的是创建一个简单的类,它是这样工作的(一个示例将演示我想要实现的) 用户专用内容 如果用户无权访问该功能,则该类将呈现一个注册链接。我知道我可以简单地使用if/else,但是else块的内容可以是2-3个不同的标准响应之一,这取决于访问级别,这个机制将在网站上的无数地方使用 如果有一种方法可以简单地阻止用户完全呈现特殊内容,那就意味着我可

我有一个正在开发的web应用程序,我希望避免视图中if/elseif/else的混乱,避免视图中有太多单独的ascx文件只是为了有条件地包含在视图中

我想做的是创建一个简单的类,它是这样工作的(一个示例将演示我想要实现的)


用户专用内容
如果用户无权访问该功能,则该类将呈现一个注册链接。我知道我可以简单地使用if/else,但是else块的内容可以是2-3个不同的标准响应之一,这取决于访问级别,这个机制将在网站上的无数地方使用


如果有一种方法可以简单地阻止用户完全呈现特殊内容,那就意味着我可以使网站周围的模板非常易于维护。

我可以想出另一个体面的选择,让你的If/else逻辑保持在局部视图中

您可以创建一个HtmlHelper扩展方法。HtmlHelper是在视图中调用诸如Html.ActionLink之类的对象时使用的对象。您可以编写自己的方法来生成所需的任何HTML。所有条件都发生在扩展方法中,您的视图代码减少为:

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

在决定何时创建HtmlHelper扩展方法以及何时创建局部视图时,我遵循的经验法则通常是要生成多少HTML。如果最终呈现的HTML超过几行,那么部分控件通常是最好的选择,因为它通常更容易理解和维护HTML

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

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

我刚刚想到了另一种解决方案:

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

无论什么

我知道它看起来有点迟钝,但是如果您看到这些页面上的内容,您就会理解。

您可以尝试的另一个选项是创建自定义服务器控件。控件上的属性可能包括要检查其权限的功能集。如果不满足该权限,控件将使注册链接适合该访问级别或权限。您的视图最终将类似于:

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

批准的用户内容。
在控件中,首先检查权限,然后呈现适当的链接或提供的HTML。这里最棘手的一点可能是将路由信息获取到服务器控制代码。我没试过。最糟糕的情况是,我想您应该能够通过属性传递必要的信息,甚至整个注册链接。没有等待,更糟糕的是完全绕过路由,并通过配置值erm强制URL进入。。。是 啊无论哪种方式,它都比您想要的示例要冗长一些,但距离不远

我想有些人甚至会认为服务器控制的想法有点不可靠。但只要您远离视图状态、回发行为和其他一些经典的ASP.NET功能,就没有什么可以阻止您使用服务器控件。我们都已经使用了母版和内容容器。如果你已经在唱诗班了,很抱歉要说教


就目前而言,这正在扩展我的想象力,甚至可能有点常识,这取决于生成链接的难度。如果我想到其他任何东西,我会回来查看。

这就是局部视图(即ascx)的用途。不知道你为什么不想用它。您可以向局部视图传递参数,就像使用
requireAccess.Feature
示例一样。你也可以考虑编写一个扩展方法,但是在C代码中需要很多HTML生成,这通常是不可取的。部分视图实际上不是一个类吗?说你想在“某种简单的课堂”上做这件事是双重对话。这正是视图的含义。@Kirk-我理解这一点,但在我的情况下,对于每个有问题的aspx文件,我最终会得到10、20、30或更多的局部视图。我一直在寻找一种解决方案,可以(a)阻止正在讨论的aspx文件分裂成大量ascx文件,以及(b)阻止代码被if/elseif/else块分割。谢谢,我已经考虑了所有这些方法。问题是,单个视图将被分割为多个不同的局部视图。我一个人工作的那台电脑本身就有20-30个ascx文件。要点是基本上能够包装任意一小块内容,如果不满足标准的站点范围的条件,就用它代替其他内容。。。。因此,这些控件不会在任何地方重复使用,部分内容最终会使项目变得混乱。让我再试一次,不同的答案…嗯,那可能有用。不过,回到ASP.NETWebForms语法让我有点恼火。如果有一种抑制响应的方法,整个问题都可以解决。暂时写输出。我想问题是逻辑需要走到某个地方,在这一点上,我们只是在讨论如何做到这一点。我曾经尝试为MVC创建我自己的“使用”友好实体/例程,类似于Html.BeginForm()机制。我想我发现在这一页中有一个特别的考虑。如果能写下我们自己的,那就太好了。我会把这个标记为正确的,因为基本上这是目前最好的答案。
<controls:SignUpWrapper runat="server" id="signup" access="FancyStuff">
    <div>
        Approved user contents.
    </div>
</controls:SignUpWrapper>