2013-07-11 51 views
1

一些身体可以解释如何真正的jQuery AJAX方法URL指向一个控制器动作我指的是技术。例如jQuery的AJAX网址

$("#Location").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: '/Vacancy/AutoCompleteLocations', 
       data: request, 
       dataType: "json", 
       type: "GET", 
       minLength: 2, 
       success: function (data) { 
        response($.map(data, function (item) { 
         return { label: item.REF_DESC, value: item.REF_DESC, id: item.REF_ID } 
        })); 
       } 
      }); 
     }, 
     select: function (event, ui) { 
      $("#hdLocationId").val(ui.item.id); 
     } 
    }); 

我想知道背后的机制如何网址:'/Vacancy/AutoCompleteLocations'指出特定行动意味着机器。

+0

如果您的意思是计算机如何从'url:'/ Vacancy/AutoCompleteLocations''中找到该操作,请参阅http://msdn.microsoft.com/library/vstudio/system.web.routing.route – jarvanJiang

回答

0

在ASP.NET MVC中,URL的形式如下的

http://HostName/ControllerName/ActionName/Id 

,你可以通过查看Application_Start

所以定义为您的网址/Vacancy/AutoCompleteLocations路线(这是一个相对的验证它URL表示它将被附加到浏览器地址栏中的URL旁边),空缺是控制器的名称(尝试在Controllers文件夹中找到VacancyController.cs),AutoCompleteLocations是Action的名称(VacancyController.cs文件中的函数)

Id部分通常是可选的。

0

的所有

$("#Location").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: 'URL.Action("ActionName","ControllerName")', 
      data: request, 
      dataType: "json", 
      type: "GET", 
      minLength: 2, 
      success: function (data) { 
       response($.map(data, function (item) { 
        return { label: item.REF_DESC, value: item.REF_DESC, id: item.REF_ID } 
       })); 
      } 
     }); 
    }, 
    select: function (event, ui) { 
     $("#hdLocationId").val(ui.item.id); 
    } 
}); 

首先,我们无论是在Global.asax中或路由表中定义的路由。

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

这是定义第一个是控制器,另一个是动作名称。

0

这是关于Routing system,这是非常constomizable。

路由是映射到处理程序的URL模式。处理程序可以是物理文件,例如Web窗体应用程序中的.aspx文件。 处理程序也可以是处理请求的类,例如MVC应用程序中的 控制器。要定义路由,您可以通过指定URL模式, 处理程序以及可选的路由名称来创建Route类的 实例。

默认情况下,在MVC项目你有以下途径:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

,指出:

  1. 在你的第一段,如果不应该是控制器的名字, - 默认情况下它会成为家;
  2. 在你的第二段应该是控制器动作的名称,如果没有 - 默认情况下它会被索引。
  3. 最后一段是id,但它是可选的。

因此,你有默认路由和URL'/空置/ AutoCompleteLocations',那么你将调用控制器空缺和行动AutoCompleteLocation。

2

一个应用程序有一个东西叫做路由表路由表将特定的URL映射到特定的控制器。一个应用程序只有一个路由表。此路由表文件中设置。如果您没有路由表,应用程序将始终给出404错误。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new 
     { 
      controller = "Home", 
      action  = "Index", 
      id   = UrlParameter.Optional 
     } // Parameter defaults 
    ); 

} 

案例-1考虑在应用程序中有Area的情况。但是,您没有在网址中提及区域名称。示例localhost/ControllerName/ActionName如果您注意网址,则不存在区域名称。根控制器目录中也没有这样的控制器。该控制器存在于区域中。假设您的应用程序中有以下区域。

Area

现在当你键入的网址:本地主机/测试/索引并回车。现在问题是背景中发生了什么?

让我们添加一个参考RoureDebugger。你可以从这个位置获得Dll。然后,我在文件的Application_Start Handler中添加了一行代码。

RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); 

当我执行应用程序。这给我显示了下面的输出,而不是索引页面响应。

RouteDebugging

如果你留意上面的截图中,缺省路由是启用这是存在于文件。这是因为没有约束的默认URL会将Controller定位到应用程序的任何位置。但该视图既不存在于根文件夹视图的目录中,也不存在于共享文件夹视图的目录中。最后你会得到404错误。

我该如何摆脱这个问题?

我在过去遇到过类似的问题,并找到了纠正措施。以下是文件中的默认路由的新版本。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    var route = routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new 
     { 
      controller = "Home", 
      action  = "Index", 
      id   = UrlParameter.Optional 
     }, // Parameter defaults 
     new[] { "MvcApplication1.Controllers" } 
    ); 
    route.DataTokens["UseNamespaceFallback"] = false; 
} 

在上面的代码中我在路径约束和route.DataTokens["UseNamespaceFallback"] = false;加入命名空间。完成此操作并使用上述URL后,控制器操作方法将永远不会执行,因为控制器中不存在区域名称。

我也想通了,就当URL不包含区域名称和默认路由不包含命名空间信息的DataTokens一个更重要的信息。下面是截图。当URL不包含区域名称和默认路由不包含命名空间信息

DataToken Without NameSpace

数据令牌信息将不可用。




现在,加入的命名空间,并在网址中添加区域名称按修改后的默认路由后。我们将在屏幕截图中获取DataToken信息,如下所示。

Data Token with NameSpace




下面是在URL

Route Debugging

添加区域名称正如你所看到的区域路线现在开启后RouteData输出。

希望这会帮助你。谢谢