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

RPM*_*984 2 javascript asp.net-mvc asp.net-mvc-routing razor asp.net-mvc-3

什么是避免在JavaScript中硬编码URL的最佳方法(主要用于进行AJAX调用时)?

在过去:

  1. 使用@Url.Action或的结果呈现JavaScript变量@Url.RouteUrl
  2. 通过的结果@Url.Action@Url.RouteUrl成JavaScript在初始化/构造函数.

有没有更好的办法?

做这样的事情会很好:

var url = $.routes("actionName", "controllerName") // or "routeName" for named routes
$.post(url, { id = 1 }, function() { //.. });
Run Code Online (Sandbox Code Playgroud)

这当然不可能实现(JavaScript没有直接访问ViewContext,因此无法访问路由表).

但我想知道是否有一种方法可以为JavaScript设置我自己的"路由表",只有我知道它需要的那些?(例如我在视图中设置)

人们如何处理这个问题?

Pra*_*sad 6

尽管在视图中注入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.
   */
});
Run Code Online (Sandbox Code Playgroud)

//控制器

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.
             */
       }
}
Run Code Online (Sandbox Code Playgroud)

这样,两种类型的用户都可以启用javascript并禁用javascript.

表格也可以这样做.