簡體   English   中英

在外部JavaScript中處理ASP.NET MVC路由

[英]Handling ASP.NET MVC Routing in External JavaScript

避免用JavaScript(主要是在進行AJAX調用時使用)對URL進行硬編碼的最佳方法是什么?

以往:

  1. 使用@Url.Action@Url.RouteUrl結果呈現JavaScript變量
  2. @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.

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