2012-02-22 48 views
0

我想创建一个类似UrlHelper类的助手类,因为它需要一个实例化的类可用于视图,但我不能为我的生活工作出UrlHelper实例化成可用在@Url视图中,因为我想要做同样的事情。每个请求创建一个UrlHelper像助手类实例?

任何人都可以启发我吗?

+0

为什么你会想要做这样的事情?请解释一下,这样我们就可以找到你想要实现的事情的一个很好的解决方案。 – 2012-02-22 16:09:41

+0

为什么我不想?我所说的我想要做的就是创建一个自己的帮手,它像UrlHelper一样在自动实例化并在所有视图中都可用 - 这不完全是“外部”请求,是吗? – Moo 2012-02-22 16:17:46

回答

4

我从来没有做过这件事,但它是你可以尝试的东西。

尝试创建一个扩展System.Web.Mvc.ViewPage的新类。我没有这台机器上的MVC源代码,所以我不能确切地说明框架如何为这些视图创建这个实例,但是您可能能够在Web.config中更改基本页面类型以使MVC创建你的新类型的实例,而不是它自己的类型。

然后,您可以将任何您想要的属性添加到该新类型,并让它们在您的视图中可访问。

你也不得不创建一个通用的该类型:Your.New.Page.Type<T>,并宣布在你的类型来看(我不太确定这是如何完成的剃刀):

<%@ 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> 
+0

宾果,这看起来像那种我需要考虑的事情,但很难找到起点,以寻找更多的信息:)谢谢! – Moo 2012-02-22 18:52:39

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

只要你有你的这篇参考,您可以这样调用此方法:

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

这不是我所问的,也不是我想做的 - 我想创建一个像UrlHelper一样的助手,因为每个请求都有一个新的实例作为@Url使用,而不是扩展UrlHelper的附加功能。 – Moo 2012-02-22 15:47:42

+0

@Moo看到我的编辑。这是否回答你的问题? – 2012-02-22 15:52:13

+0

不是真的,因为我特别需要UrlGenerator成为类的实例,而不是静态类。感谢编辑tho :) – Moo 2012-02-22 16:03:17

3

控制器的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() 
+0

将它从另一个帮助器中解放出来,在一定程度上解决了这个问题,但本质上看起来和感觉非常黑客 - 它还要求我挂起潜在的不相关的功能 – Moo 2012-02-22 15:49:51

+0

@Moo - 我认为MVC中的View的概念是所提供的Controller对象的所有功能应该完全处理视图,这是为什么这么多扩展使用HtmlHel每个类:扩展通常与呈现HTML(这是视图特定的)有关。如果您需要与视图无关的附加功能,则应该在模型中包含该功能,而不是控制器。 – ken 2012-02-22 15:58:43

+0

肯,所以你基本上说的是,没有范围的非模型特定的,非特定于视图的特殊辅助功能不能很好地作为现有帮助者之一的扩展方法来使用?因为这基本上就是我想要做的 - 提供非特定于模型和非特定视图的功能,但是我不愿意将它从一个无关的当前可用帮手中挂起来。 – Moo 2012-02-22 16:11:08

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

    } 
} 
相关问题