1

有人可以解释一下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

4 回答 4

2

一个应用程序有一个叫做Route Table的东西。路由表将特定的URL 映射到特定的控制器。一个应用程序只有一个Route Table。这个路由表是在文件中设置的。如果您没有Route Table,应用程序将始终给出 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,则没有区域名称。根控制器目录中也没有这样的控制器。该控制器存在于区域中。假设您的应用程序中有以下区域。

区域

现在你输入 url : localhost/Test/Index然后回车。现在的问题是背景发生了什么?

让我们添加一个RoureDebugger的引用。您可以从此位置获取 Dll。然后我在Application_Start Handler下的文件中添加了一行代码。

RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

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

路由调试

如果您注意上面的屏幕截图,默认路由已启用,它存在于文件中。这是因为没有约束的默认 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 不包含区域名称且默认路由不包含 NameSpace 信息时,我还发现了有关 DataTokens 的另一个重要信息。下面是截图。

没有命名空间的 DataToken

当 Url 不包含 Area Name 且 Default Route 不包含 NameSpace 信息时,Data Token 信息将不可用。




现在,在按照修改后的默认路由添加 NameSpace 并在 Url 中添加区域名称之后。我们将在屏幕截图中获得如下所示的 DataToken 信息。

带有命名空间的数据令牌




下面是RouteData在 URL 中添加区域名称后的输出

路由调试

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

希望这会帮助你。谢谢

于 2013-07-11T08:04:39.770 回答
0

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

http://HostName/ControllerName/ActionName/Id

您可以通过查看定义的路由来验证它Application_Start

因此,对于您的 URL /Vacancy/AutoCompleteLocations(这是一个相对 URL,意味着它将附加在浏览器地址栏中的 URL 旁边),Vacancy 是控制器的名称(尝试VacancyController.cs在 Controllers 文件夹中查找)并且AutoCompleteLocations是操作的名称(a VacancyController.cs 文件中的函数)

Id 部分通常是可选的。

于 2013-07-11T05:45:05.607 回答
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
        );

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

于 2013-07-11T05:47:42.297 回答
0

路由系统的关注点非常可定制。

路由是映射到处理程序的 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. 在您的第一段中应该是控制器的名称,如果不是 - 默认情况下它将是 Home;
  2. 在您的第二段中应该是控制器操作的名称,如果没有 - 默认情况下它将是索引。
  3. 最后一段是id,但它是可选的。

因此,如果您有默认路由和 url '/Vacancy/AutoCompleteLocations',那么您将调用控制器 Vacancy 和操作 AutoCompleteLocation。

于 2013-07-11T06:17:45.827 回答