每个请求创建一个类似帮助器类实例的UrlHelper?

时间:2012-02-22 14:52:25

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

我想创建一个类似于UrlHelper类的辅助类,因为它需要对视图可用的类的实例化,但我不能在我的生活中解决UrlHelper实例化的问题在@Url视图中可用,因为我想做同样的事情。

任何人都可以启发我吗?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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()

答案 2 :(得分:1)

像这样创建你的助手:

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";
    }
}

只要您在View中有此引用,就可以像这样调用此方法:

@{
    UrlGenerator ug = new UrlGenerator();
    ug.MakeUrl();
}

答案 3 :(得分:0)

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

    }
}