簡體   English   中英

在類中使用幫助器時,如何將對象作為RouteValueDictionary傳遞給Url.Action?

[英]How can I pass an object to Url.Action as a RouteValueDictionary when I use the helper in a class?

簡短版:我有一個擴展方法,用於擴展MVC 5的UrlHelper幫助器方法。 我想將(字符串操作,字符串控制器,對象routeValues)傳遞給此方法,並在其中使用Url.Action(“ action”,“ controller”,routeValues)。 當我這樣做時,會為routeCollection獲取ArgumentNullException 做到這一點的正確方法是什么?

長版我有以下擴展方法:

public static string ActionToUrl(this UrlHelper url, string action, string controller, object routeValues)
    {
        Uri contextUri = HttpContext.Current.Request.Url;

        var relativeContentPath = url.Action(action, controller, routeValues);

        var baseUri = string.Format("{0}://{1}{2}", contextUri.Scheme,
           contextUri.Host, contextUri.Port == 80 ? string.Empty : ":" + contextUri.Port);

        return string.Format("{0}{1}", baseUri, VirtualPathUtility.ToAbsolute(relativeContentPath));
    }

想法是,此方法將在使用時返回絕對URL路徑,而不是Url.Action返回的相對路徑。

但是,我得到一個ArgumentNullException,當我嘗試使用Url.Action這里面與RouteValueDictionary過載:

值不能為空。 參數名稱:routeCollection

如果我使用簡單的(動作,控制器)重載,則不會得到此異常。

我也嘗試構建RouteValueDictionaryRouteValueDictionary(object routeValues)構造函數,然后將它發送到Url.Action ,如:

var routeValueDictionary = new RouteValueDictionary();

var relativeContentPath = url.Action(action, controller, routeValueDictionary);

但是我遇到了同樣的錯誤,所以我知道問題不在於從objectRouteValueDictionary的轉換。

我在這里想念什么?

編輯:

當我在視圖中使用擴展程序時,該擴展程序實際上正在工作。 當我從服務類中的新UrlHelper調用此函數時,出現異常。 為什么會出現此異常?

好解決了。 萬一有人需要這樣做:問題不在於擴展方法,而在於我的調用方式。 我正在使用默認構造函數實例化一個新的UrlHelper ,但是我需要使用采用requestContext的構造函數。

因此,如果要在控制器中使用它,請使用以下命令構造UrlHelper

var url = new UrlHelper(Request.RequestContext);

並在一個單獨的類中:

var url = new UrlHelper(HttpContext.Current.Request.RequestContext);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM