为每个请求创建一个类似UrlHelper的助手类实例
本文关键字:UrlHelper 实例 请求 创建 一个 | 更新日期: 2023-09-27 18:25:37
我想创建一个类似于UrlHelper类的helper类,因为它需要该类的实例化才能在视图中可用,但我无法确定UrlHelper在视图中实例化为@Url的位置,因为我也想做同样的事。
有人能启发我吗?
我以前从未这样做过,但你可以尝试一下。
尝试创建一个扩展System.Web.Mvc.ViewPage的新类。我在这台机器上没有Mvc源,所以我不能确切地说框架是如何为视图创建这个实例的,但你可以在Web.config中更改基页类型,使Mvc创建你的新类型的实例,而不是它自己的类型。
然后,您可以将想要的任何属性添加到新类型中,并在视图中对其进行访问。
您还必须为该类型创建一个泛型:Your.New.Page.Type<T>
,并将其声明为您视图中的类型(我不确定Razor中是如何做到这一点的):
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Youre.New.Page.Type" %>
我可能遗漏了很多东西。
参见pageBaseType
属性:
<configuration>
<system.web>
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="Your.New.Page.Type, Your.New"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
</pages>
</system.web>
</configuration>
Controller的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>
更新:作为对您意见的回应,请考虑在您的模型中添加非视图特定功能:
@Model.MyObject.GetSomeProperty()
创建这样的助手:
public static class Extensions
{
public static string SomeUrl(this UrlHelper urlHelper)
{
return "someUrl";
}
}
在你看来,你可以这样引用它:
@Url.SomeUrl()
如果它们在不同的名称空间中,您需要在视图的顶部显示以下内容:
@using YourContainingExtNameSpace
编辑:
如果您不想扩展UrlHelper
类,可以创建一个单独的类,如下所示:
public class UrlGenerator
{
public string MakeUrl()
{
return "someUrl";
}
}
只要你的视图中有这个引用,你就可以这样调用这个方法:
@{
UrlGenerator ug = new UrlGenerator();
ug.MakeUrl();
}
我唯一能想到的就是在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)
{
}
}