[英]Handling ASP.NET MVC Routing in External JavaScript
避免用JavaScript(主要是在進行AJAX調用時使用)對URL進行硬編碼的最佳方法是什么?
以往:
@Url.Action
或@Url.RouteUrl
結果呈現JavaScript變量 @Url.Action
或@Url.RouteUrl
結果@Url.RouteUrl
給init / ctor中的JavaScript。 有沒有更好的辦法?
最好執行以下操作:
var url = $.routes("actionName", "controllerName") // or "routeName" for named routes
$.post(url, { id = 1 }, function() { //.. });
當然,這實際上是不可能的(JavaScript無法直接訪問ViewContext,因此無法訪問路由表)。
但是我想知道是否有一種方法可以為JavaScript設置我自己的“路由表”,僅使用我知道需要的那些方法? (例如我在視圖中設置)
人們如何處理呢?
盡管我更喜歡將JavaScript注入視圖中-讓HTML來完成其工作,而javascript來完成。 下面是模式。
/*A cssclass=ajaxlink is added to all those links which we want to ajaxify*/
//html in view
<a class='ajaxlink' href='@Url.Action("Action","Controller")'>I am An Ajax Link</a>
//generated clean html
<a class='ajaxlink' href='/controller/action'>I am An Ajax Link</a>
//Js
jQuery('.ajaxlink').live('click',function(e){
e.preventDefault(); /*Prevent default behavior of links*/
var url= $(e.target).attr('href');
/*
Now u have url, do post or get:
then append received data in some DOM element.
*/
});
//控制器
public ActionResult()
{
if(Request.IsAjax())
{
/*Return partial content*/
return View();
}
else
{
return View("SomeOther_View.cshtml");
/*
At this point you may reject this request or return full view
whatever you feel is okie.
*/
}
}
這樣,可以同時啟用和禁用javascript兩種類型的用戶。
表單也可以這樣做。
實現Javascript路由引擎不會太困難。 首先,序列化從C#到Javascript的路由。 其次,重新創建Url.Action
方法。
但是,對於我從事的任何項目來說,這都有些過分。 我團隊的項目始終呈現一個通用的Javascript變量,該變量包含所有必需的URL。
這種方法可確保采取強類型的操作方法,並且也更適合重構。
說起來容易做起來難,但是在關閉JavaScript的情況下,您的網站應該可以正常運行。 完成此操作后,您應該能夠在網站上添加AJAX支持,並在錨標簽或FORM標簽中重復使用現有的HREF屬性。 該網站將更易於維護,因為您無需更新JavaScript文件中的鏈接。
我決定實現自己的UrlFactory,直接在代碼中使用ASP.NET幫助器(Html / Url),現在我沒有src了,明天再發表。
優點:我可以輕松跟蹤每個URL並以集中方式執行一些重寫。
用法示例:
@{
string myAjaxUrl = UrlFactory.GetUrl (ActionName, ControllerName, new { query-params });
}
然后在javascript中使用'em
var jsUrl = '@myAjaxUrl';
一旦定義了自己的Factory,就可以劫持“重要的” URL(例如,用於重寫),並將其保留給Url幫助器實現。
但是,為了擁有完整的客戶端,還有一個額外的步驟就是呈現Js路由上下文,以訪問客戶端變量。
編輯:如許諾我非常簡單的URL類生成器:
public static class UrlFactory
{
public static string GetUrl(string Action, string Controller, object RouteValues)
{
UrlHelper Url = new UrlHelper(HttpContext.Current.Request.RequestContext);
return Url.Action(Action, Controller, RouteValues);
}
// Common URLS for Denied et similars.
public static string GetDeniedUrl(PEDUtenti Utente, object RouteValues)
{
return GetUrl(Utente, "Denied", "Errors", RouteValues);
}
public static string GetDeniedUrl(object RouteValues)
{
return GetUrl("Denied", "Errors", RouteValues);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.