您好,登錄后才能下訂單哦!
本篇內容主要講解“ASP.NET表達式樹怎么構建DomainRoute的URL域名”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“ASP.NET表達式樹怎么構建DomainRoute的URL域名”吧!
這里我們將介紹ASP.NET表達式樹來構建mainRoute的URL,本文將使用類似于MvcFutures中定義的基于表達式樹的輔助方法。
由于DomainRoute支持針對URL域名的捕獲和構造,這有些破壞了ASP.NET Routing所制定的“協議”(ASP.NET Routing只支持Path),因此在上一篇文章中,我們需要自己構造一個輔助方法來獲得一個“包含域名”的URL。不過根據盡可能強類型的原則,我們應該使用的是類似于MvcFutures中定義的基于表達式樹的輔助方法。由于MvcFutures已經提供了非常充足的輔助功能,因此這其實并不需要耗費我們多少代價。
我們編寫了這樣的ASP.NET表達式樹輔助方法:
public static string ActionEx(this UrlHelper helper, string action, object routeValues) { var values = routeValues == null ? new RouteValueDictionary() : new RouteValueDictionary(routeValues); values.Add("action", action); values.Add("controller", helper.RequestContext.RouteData.Values["controller"]); return helper.GetRouteUrl(values); } private static string GetRouteUrl(this UrlHelper helper, RouteValueDictionary values) { var pathData = helper.RouteCollection.GetPath(helper.RequestContext, values); var url = pathData.VirtualPath; return IsAbsolute(url) ? url : "/" + url; }
但是根據我們的需要,我們應該設法編寫如下的代碼:
<a href="<%= Url.ActionEx(c => c.Index()) %>">Homea>
那么,這個ActionEx方法的簽名應該是什么樣的呢?從一個方法的調用方式上得出它的簽名也是構造良好API的必要能力。在這里,我們可以把ActionEx方法的簽名定成:
public static string ActionEx<TController>( this UrlHelper helper, Expression<Action<TController>> action) where TController : Controller { return ActionEx(helper, action, null); } public static string ActionEx<TController>( this UrlHelper helper, Expression<Action<TController>> action, object routeValues) where TController : Controller { ... }
與原來的ActionEx方法不同,原來的ActionEx方法僅僅攜帶了一個字符串,而現在的action是一個ASP.NET表達式樹,其中包含了大量的信息:調用哪個Controller中的哪個Action方法,并使用了哪些參數。例如,以下兩種用法,最終生成的URL是相同的:
<%= Url.ActionEx("List", new { controller = "Post", id = 5, area = "blogs" }) %> <%= Url.ActionEx<PostController>(c => c.List(5), new { area = "blogs" }) %>
這樣,您應該就可以看出兩種情況下,各種必要的數據是如何傳遞進來的。因此,新增的ActionEx方法應該是這樣:
public static string ActionEx<TController>( this UrlHelper helper, Expression<Action<TController>> action, object routeValues) where TController : Controller { var values = GetRouteValuesFromExpression(action); if (routeValues != null) { values.CopyFrom(new RouteValueDictionary(routeValues)); } return helper.GetRouteUrl(values); } private static RouteValueDictionary GetRouteValuesFromExpression<TController>( Expression<Action<TController>> action) where TController : Controller { ... }
您應該可以料想得到,這里的關鍵是如何從表達式樹中提取數據(即GetRouteValuesFromExpression方法的實現)。如果您不了解表達樹,那么這方面可能略有難度。幸運的是,其實MvcFutures項目已經幫我們自帶了充足的輔助功能:
private static RouteValueDictionary GetRouteValuesFromExpression<TController>( Expression<Action<TController>> action) where TController : Controller { return ExpressionHelper.GetRouteValuesFromExpression(action); }
就這樣,結束了。當然,原有MvcFutures中缺少或不足的功能也直接帶入了我們的項目中,下次我們便要改進這些功能。
到此,相信大家對“ASP.NET表達式樹怎么構建DomainRoute的URL域名”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。