Jquery ajax url在控制器动作中

时间:2013-07-11 05:30:21

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-2

有些人可以解释实际上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'如何指出特定行动意味着机器。

4 个答案:

答案 0 :(得分: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的情况。但是,您没有在URL中提及区域名称。示例 localhost / ControllerName / ActionName 如果您注意URL,则没有区域名称。根控制器目录中也没有这样的控制器。该控制器存在于区域中。假设您在申请中有以下区域。

Area

现在输入网址: localhost / Test / Index 并按Enter键。现在的问题是背景中发生了什么?

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

RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

执行应用程序时。这显示了以下输出,而不是索引页面响应。

RouteDebugging

如果您注意上面的屏幕截图,则启用默认路由,该路由存在于文件中。这是因为没有约束的默认Url会将Controller定位在应用程序的任何位置。但View不存在于根文件夹视图的目录中,也不存在于共享文件夹视图的目录中。最后,您将收到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;
}

在上面的代码中,我在约束中添加了Namespace,在路由中添加了route.DataTokens["UseNamespaceFallback"] = false;。执行此操作并使用上述URL后,将永远不会执行Controller Action Method,因为Controller中不存在Area Name。

当Url不包含Area Name且默认路由不包含NameSpace信息时,我还想出了一个关于DataTokens的重要信息。下面是截图。

DataToken Without NameSpace

当网址不包含区域名称且默认路由不包含NameSpace信息时,数据令牌信息将不可用。




现在,添加NameSpace并根据修订的默认路由在Url中添加区域名称。我们将在屏幕截图中显示如下所示的DataToken信息。

Data Token with NameSpace




在Url

中添加区域名称后,下面是RouteData输出

Route Debugging

正如您所见,现在已启用区域路线。

希望这会对你有所帮助。感谢

答案 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
        );

那说:

  1. 在您的第一个段中应该是控制器的名称,如果不是 - 默认情况下它将是Home;
  2. 在你的第二段中应该是控制器动作的名称,如果没有 - 默认情况下它将是索引。
  3. 最后一段是id,但它是可选的。
  4. 所以id你有默认路由和url'/ Vacancy / AutoCompleteLocations'然后你会调用控制器空缺和动作AutoCompleteLocation。