[英]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
如果我使用簡單的(動作,控制器)重載,則不會得到此異常。
我也嘗試構建RouteValueDictionary
其RouteValueDictionary(object routeValues)
構造函數,然后將它發送到Url.Action
,如:
var routeValueDictionary = new RouteValueDictionary();
var relativeContentPath = url.Action(action, controller, routeValueDictionary);
但是我遇到了同樣的錯誤,所以我知道問題不在於從object
到RouteValueDictionary
的轉換。
我在這里想念什么?
編輯:
當我在視圖中使用擴展程序時,該擴展程序實際上正在工作。 當我從服務類中的新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.