有些人可以解释实际上jquery ajax方法url指向控制器动作吗?我的意思是技术背后的机制。例如
$("#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);
}
});
我想知道url:'/ Vacancy / AutoCompleteLocations'如何指出特定行动意味着机器。
答案 0 :(得分:2)
asp.net-mvc应用程序有一个名为路由表的东西。 路由表将特定URL映射到特定控制器。应用程序只有一个路由表。此路由表在global-asax文件中设置。如果您没有路由表,应用程序将始终给出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的情况。但是,您没有在URL中提及区域名称。示例 localhost / ControllerName / ActionName 。 如果您注意URL,则没有区域名称。根控制器目录中也没有这样的控制器。该控制器存在于区域中。假设您在申请中有以下区域。
现在输入网址: localhost / Test / Index 并按Enter键。现在的问题是背景中发生了什么?
我们添加了 RoureDebugger 的参考。你可以从这个位置获得Dll。然后我在 Application_Start 处理程序下的global-asax文件中添加了一行代码。
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
执行应用程序时。这显示了以下输出,而不是索引页面响应。
如果您注意上面的屏幕截图,则启用默认路由,该路由存在于global-asax文件中。这是因为没有约束的默认Url会将Controller定位在应用程序的任何位置。但View不存在于根文件夹视图的目录中,也不存在于共享文件夹视图的目录中。最后,您将收到404错误。
如何解决此问题?
我过去遇到了类似的问题并找到了纠正措施。下面是global-asax文件中默认路由的新版本。
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;
}
在上面的代码中,我在约束中添加了Namespace,在路由中添加了route.DataTokens["UseNamespaceFallback"] = false;
。执行此操作并使用上述URL后,将永远不会执行Controller Action Method,因为Controller中不存在Area Name。
当Url不包含Area Name且默认路由不包含NameSpace信息时,我还想出了一个关于DataTokens的重要信息。下面是截图。
当网址不包含区域名称且默认路由不包含NameSpace信息时,数据令牌信息将不可用。
现在,添加NameSpace并根据修订的默认路由在Url中添加区域名称。我们将在屏幕截图中显示如下所示的DataToken信息。
在Url
中添加区域名称后,下面是RouteData
输出
正如您所见,现在已启用区域路线。
希望这会对你有所帮助。感谢
答案 1 :(得分:0)
在ASP.NET MVC中,URL具有以下形式
http://HostName/ControllerName/ActionName/Id
您可以通过查看Application_Start
因此,对于您的网址/Vacancy/AutoCompleteLocations
(相对网址意味着它将附加在浏览器地址栏中的网址旁边),空缺是控制器的名称(尝试查找{ Controllers文件夹中的{1}}和VacancyController.cs
是Action的名称(VacancyController.cs文件中的函数)
Id部分通常是可选的。
答案 2 :(得分: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
);
这是定义第一个是Controller,另一个是动作名称。
答案 3 :(得分:0)
Routing system关注的是非常具体的。
路由是映射到处理程序的URL模式。处理程序可以 是一个物理文件,例如Web窗体应用程序中的.aspx文件。 处理程序也可以是处理请求的类,例如a 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
);
那说:
所以id你有默认路由和url'/ Vacancy / AutoCompleteLocations'然后你会调用控制器空缺和动作AutoCompleteLocation。