C# 是否为每个请求创建一个类似UrlHelper的helper类实例?
我想创建一个类似于UrlHelper类的helper类,因为它要求类的实例化对视图可用,但我无法确定UrlHelper在视图中实例化为@Url的位置,因为我想做同样的事情 有人能启发我吗?像这样创建您的助手:C# 是否为每个请求创建一个类似UrlHelper的helper类实例?,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我想创建一个类似于UrlHelper类的helper类,因为它要求类的实例化对视图可用,但我无法确定UrlHelper在视图中实例化为@Url的位置,因为我想做同样的事情 有人能启发我吗?像这样创建您的助手: public static class Extensions { public static string SomeUrl(this UrlHelper urlHelper) { return "someUrl"; } } @Url.SomeUrl
public static class Extensions
{
public static string SomeUrl(this UrlHelper urlHelper)
{
return "someUrl";
}
}
@Url.SomeUrl()
public class UrlGenerator
{
public string MakeUrl()
{
return "someUrl";
}
}
在您看来,您可以这样引用它:
public static class Extensions
{
public static string SomeUrl(this UrlHelper urlHelper)
{
return "someUrl";
}
}
@Url.SomeUrl()
public class UrlGenerator
{
public string MakeUrl()
{
return "someUrl";
}
}
如果它们位于不同的名称空间中,则需要在视图顶部显示:
@using YourContainingExtNameSpace
编辑:
如果不想扩展UrlHelper
类,可以创建一个单独的类,如下所示:
public static class Extensions
{
public static string SomeUrl(this UrlHelper urlHelper)
{
return "someUrl";
}
}
@Url.SomeUrl()
public class UrlGenerator
{
public string MakeUrl()
{
return "someUrl";
}
}
只要视图中有此引用,您就可以这样调用此方法:
@{
UrlGenerator ug = new UrlGenerator();
ug.MakeUrl();
}
控制器的UrlHelper是在MVC框架本身中设置的。向视图中可用的控制器添加另一个对象级属性需要对框架进行黑客攻击(如果我错了,请告诉我) 通常,最好创建一个扩展方法,返回视图中所需的对象。例如:
public static class UrlHelperExtensions
{
public static MyObjectType GetMyObject(this UrlHelper urlHelper)
{
return new MyObjectType();
}
}
要像这样使用GetMyObject()
:@Url.GetMyObject()
,您需要包括在Web.config中声明扩展方法的命名空间:
<namespaces>
<!-- other namespaces will be here -->
<add namespace="My.Namespace" />
</namespaces>
我以前从未这样做过,但你可以试试 尝试创建扩展System.Web.Mvc.ViewPage的新类。我在这台机器上没有MVC源代码,所以我不能确切地说框架如何为视图创建这个实例,但是您可以在Web.config中更改基本页面类型,使MVC创建新类型的实例,而不是它自己的类型 然后,您可以向该新类型添加任何您想要的属性,并在视图中访问它们 您还必须为该类型创建一个泛型:
Your.New.Page.type
,并将其声明为视图中的类型(我不确定Razor中是如何实现的):
我唯一能想到的就是在UrlHelper上创建一个扩展,并在那里实现您的需求
public static class UrlExtensions
{
public static string CustomThingy(this UrlHelper urlHelper)
{
//Do your custom stuff in here and add extra parameters if you need them
//For example some Func or Expression or more simpler a string
}
}
然而,问题仍然是您想用它做什么,因为在某些情况下,编写AjaxExtension或HtmlExtension会更容易。这就是我最初对你的问题发表评论的原因。所有这些都为您提供了不同概念的访问
public static class HtmlExtensions
{
public static string CustomThingy(this HtmlHelper urlHelper)
{
}
}
public static class AjaxExtensions
{
public static string CustomThingy(this AjaxHelper urlHelper)
{
}
}
这不是我要求的,也不是我想做的-我想创建一个类似于UrlHelper的帮助器,因为它在每个请求中都有一个新实例作为@Url提供,而不是使用附加功能扩展UrlHelper。这不是真的,因为我特别需要UrlGenerator作为类的实例,而不是静态类。谢谢你的编辑tho:)@Moo:)再次查看我的编辑。这就是你要找的吗?我基本上只是使类成为非静态的,并在视图代码中实例化它。是的,这基本上就是我想要的,但我不想在任何地方都具体地进行实例化-UrlHelper在其他地方实例化并可用,这就是我在这里尝试的方法。这是有意义的,因为它只是使功能可用,而不必设置它。但是,如果不深入MVC,您似乎无法与UrlHelper的工作方式相结合:(@Moo Ahhh,我明白您的意思。
Url
是WebViewPage
类的属性。换句话说,您可以访问WebViewPage
实例的Url
属性(通过视图,因为这是当前上下文)。控制器的方式相同。它有一个Url
属性(类型为UrlHelper
)这是控制器
基类的一部分。将它挂在另一个助手上在一定程度上解决了问题,但本质上看起来和感觉都非常粗糙-而且它还要求我挂在一个现有助手上可能不相关的功能,这是我首先要避免的。@Moo--我认为MVC中视图的思想是,所提供的控制器对象的所有功能都应该单独处理视图,这就是为什么这么多扩展使用HtmlHelper类:这些扩展通常与呈现HTML有关(特定于视图)。如果您需要与视图无关的其他功能,您可能应该在您的模型中包含该功能,而不是在controller.ken中,因此您本质上的意思是,对于非特定于模型、非特定于视图的额外帮助器功能,没有任何范围不适合作为一种扩展方法来使用e现有的帮助者?因为这基本上就是我想要做的-提供非模型特定和非视图特定的功能,但我不愿意将其挂在一个不相关的当前可用的帮助者上。您为什么会想做这样的事情?请解释,以便我们能为您尝试的事情找到一个好的解决方案实现。为什么我不想呢?我想说的是,我想做的就是创建我自己的帮助程序,就像UrlHelper一样,自动实例化并在所有视图中都可用-这不完全是“存在”请求,是吗?宾果,这看起来像是我需要调查的事情,但是我很难找到搜索更多信息的起点:)谢谢!