未找到Asp Mvc 4动作

时间:2014-10-21 04:34:16

标签: asp.net asp.net-mvc asp.net-mvc-4 http-status-code-404 url-routing

我正在ASP MVC 4中开展一个项目。它运作良好。但前几天我有一个非常奇怪的问题。 我有控制器"仪表板"当我将其索引称为〜/ Dashboard / index时,它工作正常,但如果我将其称为〜/ Dashboard,则会发现HTTP 404未找到错误。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "UI.Web.Controllers" }
            );

我甚至为Dashboard控制器添加了一个路由配置,但它没有工作

routes.MapRoute(
            name: "Dashboard",
            url: "Dashboard/{action}/{id}",
            defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "UI.Web.Controllers" }
            );

在我的管理区域的某些控制器中存在同样的问题(一些工作正常,一些提供HTTP 404未找到错误。 我的区域路由配置是:

context.MapRoute(
                "DMS_Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { controller = "Contact", action = "Index", id = UrlParameter.Optional },
                new string[] { "UI.Web.Areas.Admin.Controllers" }
            );

在管理区域中某些控制器的索引操作无法正常工作,而一个控制器的AddEdit操作也无法正常工作。

public ActionResult AddEdit(string id)
        {
            var user = new Models.RegisterModel();//string.IsNullOrWhiteSpace(id) ? new Models.RegisterModel() : Membership.GetUser(id);

            if (!string.IsNullOrWhiteSpace(id))
            {
                var obj = Membership.GetUser(id);
                if (obj != null)
                {
                    user.Email = obj.Email;
                    user.UserName = obj.UserName;
                }
            }

            ViewBag.PageTitle = string.IsNullOrWhiteSpace(id) ? "Add User" : "Edit User";
            ViewBag.IsAjax = Request.IsAjaxRequest();
            if (Request.IsAjaxRequest())
                return PartialView("~/Areas/Admin/Views/Users/AddEditPartial.cshtml", user);
            return View("~/Areas/Admin/Views/Users/AddEdit.cshtml", user);
        }

在AddEdit操作中,如果我将其称为〜/ Admin / User / AddEdit / a它可以工作,但如果我将其称为〜/ Admin / User / AddEdit,它也会发现HTTP 404未找到错误。

是由于某些框架更新问题或代码问题导致的这种行为?任何的想法.... 我不认为这是编码问题,因为相同的代码之前正在......

现在我正在完成我的项目,在最后阶段我被困在这里。

完成routes.config如下所示:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
                name: "Dashboard",
                url: "Dashboard/{action}/{id}",
                defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "UI.Web.Controllers" }
                );

    routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "UI.Web.Controllers" }
                );

我的AdminAreaRegistration代码是:

context.MapRoute(
                "DMS_Users",
                "Admin/Users/{action}/{id}",
                new { controller = "Users", action = "Index", id = UrlParameter.Optional },
                new string[] { "UI.Web.Areas.Admin.Controllers" }
            );
context.MapRoute(
                "DMS_Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { controller = "Contact", action = "Index", id = UrlParameter.Optional },
                new string[] { "UI.Web.Areas.Admin.Controllers" }
            );

3 个答案:

答案 0 :(得分:1)

正如Tieson T.指出的那样,增加路线的顺序很重要。匹配的第一个路由将映射到处理程序。

定义路线可能会令人困惑并且难以诊断。我发现以下提示有助于使用路线:

  1. 调试路线:您可以使用route debugger解释here
  2. 在RouteConfig文件中定义尽可能少的路由。
  3. 如果您有关于哪个URL映射到哪条路线的更多信息,则可以更轻松地找出如何调整RouteConfig.cs文件中的顺序。如果您仍然遇到问题,请按相同的顺序共享所有路由,并分享哪个URL有问题。

答案 1 :(得分:0)

我无法找到原因。所以现在要完成我的项目,我将所有控制器从Admin区域移动到root。这对我有用。 但问题仍然存在,为什么会发生这种情况以及如何解决这个问题。

答案 2 :(得分:0)

添加默认操作路线:

    routes.MapRoute(
        name: "DefaultAction",
        url: "{controller}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

对于管理区域:

        routes.MapRoute(
            name: "DefaultId",
            url: "Admin/{controller}/{action}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );