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

Handling ASP.NET MVC Routing in External JavaScript

本文关键字:外部 JavaScript 路由 MVC ASP NET 处理      更新时间:2023-09-26

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

过去:

  1. @Url.Action@Url.RouteUrl的结果渲染JavaScript变量
  2. @Url.Action@Url.RouteUrl的结果传递给init/tor中的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支持,并在您的锚标记中重用现有的HREF属性或表单标记中的动作属性。该网站将更容易维护,因为您不需要更新JavaScript文件中的链接。

我决定使用ASP实现我自己的UrlFactory。. NET helper直接(Html/Url)在我的代码,现在我没有src与我,我将张贴他们明天。

优点:我可以很容易地跟踪每个url,并以集中的方式执行一些重写。

用法示例:

@{
  string myAjaxUrl = UrlFactory.GetUrl (ActionName, ControllerName, new { query-params });
}

然后在javascript中使用

var jsUrl = '@myAjaxUrl';

一旦你定义了自己的Factory,你就可以劫持"重要的"url(例如:用于重写),并将common留给Url helper实现。

然而,要拥有这个完整的客户端,还有一个额外的步骤来渲染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);
    }
}