2012-02-22 44 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) 
    { 

    } 
} 
相關問題