【问题标题】:Creating a UrlHelper like helper class instance per request?为每个请求创建一个类似帮助类实例的 UrlHelper?
【发布时间】:2012-02-23 00:52:19
【问题描述】:

我想创建一个与 UrlHelper 类类似的辅助类,因为它需要类的实例化才能对视图可用,但我终其一生都无法确定将 UrlHelper 实例化为的位置在视图中作为@Url 可用,因为我想做同样的事情。

任何人都可以启发我吗?

【问题讨论】:

  • 你为什么想做这样的事情?请解释一下,以便我们为您想要实现的目标找到一个好的解决方案。
  • 我为什么不想呢?我想说的就是创建我自己的帮助器,它的作用类似于 UrlHelper 自动实例化并在所有视图中可用 - 这不完全是“外部”请求,是吗?

标签: c# asp.net-mvc asp.net-mvc-3


【解决方案1】:

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

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

【讨论】:

  • Bingo,这看起来像是我需要研究的东西,但很难找到搜索更多信息的起点:) 谢谢!
【解决方案2】:

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>

更新: 针对您的评论,请考虑向您的模型添加非 View 特定功能:

@Model.MyObject.GetSomeProperty()

【讨论】:

  • 将它挂在另一个助手上可以在一定程度上解决问题,但在本质上看起来和感觉非常hacky - 而且它还要求我将可能不相关的功能挂在现有助手之一上,这是我首先要避免的事情。
  • @Moo -- 我认为 MVC 中视图的想法是提供的控制器对象的所有功能都应该只处理视图,这就是为什么这么多扩展使用 HtmlHelper 类:通常与呈现 HTML(特定于视图)有关。如果您需要与视图无关的附加功能,您可能应该将该功能包含在您的模型中,而不是您的控制器中。
  • ken,所以你实质上是说没有非特定于模型、非特定于视图的额外帮助器功能的范围,它不能很好地作为一种扩展方法现有的助手?因为这基本上是我想要做的 - 提供非特定于模型和非特定于视图的功能,但我不喜欢把它挂在一个不相关的当前可用帮助器上
【解决方案3】:

像这样创建你的助手:

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 一样的助手,因为它有一个新实例,每个请求都可以作为 @Url 使用,而不是扩展 UrlHelper附加功能。
  • 不是,因为我特别需要 UrlGenerator 作为类的实例,而不是静态类。感谢您的编辑 :)
  • @Moo :) 再次查看我的编辑。那是你要找的吗?我基本上只是让类非静态并在视图代码中实例化它。
  • 是的,这基本上就是我想要的,但我不想在任何地方都专门进行实例化 - UrlHelper 在其他地方被实例化并可用,这是我在这里尝试的方法.这是有道理的,因为它只是使功能可用而无需设置它。但是,如果不深入研究 MVC 的内容,您似乎无法与 UrlHelper 的方式联系起来:(
  • @Moo Ahhh,我明白你在说什么。 UrlWebViewPage 类的属性。换句话说,您可以访问该WebViewPage 实例的Url 属性(通过视图,因为那是当前上下文)。控制器也是如此。它有一个Url 属性(UrlHelper 类型),它是Controller 基类的一部分。
【解决方案4】:

我唯一能想到的就是在 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)
    {

    }
}

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多