我正在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" }
);
答案 0 :(得分:1)
正如Tieson T.指出的那样,增加路线的顺序很重要。匹配的第一个路由将映射到处理程序。
定义路线可能会令人困惑并且难以诊断。我发现以下提示有助于使用路线:
如果您有关于哪个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 }
);