为每个请求创建一个类似UrlHelper的助手类实例

本文关键字:UrlHelper 实例 请求 创建 一个 | 更新日期: 2023-09-27 18:25:37

我想创建一个类似于UrlHelper类的helper类,因为它需要该类的实例化才能在视图中可用,但我无法确定UrlHelper在视图中实例化为@Url的位置,因为我也想做同样的事。

有人能启发我吗?

为每个请求创建一个类似UrlHelper的助手类实例

我以前从未这样做过,但你可以尝试一下。

尝试创建一个扩展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)
    {
    }
}