gpt4 book ai didi

c# - ASP .NET MVC 区域注册

转载 作者:太空狗 更新时间:2023-10-30 01:01:05 25 4
gpt4 key购买 nike

我的“管理”区域注册没有什么问题,它存储在“管理”区域文件夹内的 AdminAreaRegistration.cs 中。我的路线如下所示:

        context.MapRoute(
"Admin_News",
"Admin/News",
new { controller = "News", action = "Index" }
);

context.MapRoute(
"Admin_Pages",
"Admin/Pages",
new { controller = "Pages", action = "Index" }
);

context.MapRoute(
"Admin_Galleries",
"Admin/Galleries",
new { controller = "Galleries", action = "Index" }
);

context.MapRoute(
"Admin_Categories",
"Admin/Categories",
new { controller = "Categories", action = "Index" }
);

context.MapRoute(
"Admin_Products",
"Admin/Products",
new { controller = "Products", action = "Index" }
);

context.MapRoute(
"Admin_Files",
"Admin/Files",
new { controller = "Files", action = "Index" }
);

context.MapRoute(
"Admin_Orders",
"Admin/Orders",
new { controller = "Orders", action = "Index" }
);

context.MapRoute(
"Admin_Codes",
"Admin/Codes",
new { controller = "Codes", action = "Index" }
);

context.MapRoute(
"Admin_Login",
"Admin/Login",
new { controller = "Login", action = "Index" }
);

context.MapRoute(
"Admin_Panel",
"Admin",
new { controller = "Index", action = "Index" }
);

context.MapRoute(
"Admin_Default",
"Admin/{controller}/{action}/{param}",
new { param = UrlParameter.Optional }
);

问题是:当我登录我使用的帖子时

return Redirect("~/Admin");

一切都很好,直到我想点击链接(生成良好)

<li><a href="@Url.RouteUrl("Admin_Categories")">Categories</a></li> ==
<li><a href="~/Admin/Categories">Categories</a></li>

然后我应该被重定向到 Categories Controller 的 Index 操作,但我被重定向到 Login Controller 的 Index 操作。知道为什么会这样吗?

最好的问候!

编辑 1:

好吧,我已经将 Admin_Categories 路由更改为这个:

context.MapRoute(
"Admin_Categories",
"Admin/Categories/{action}",
new { controller = "Categories" }
);

它似乎可以工作,但现在 url 正在生成带有操作名称,在索引操作的情况下我不会这样:

<li><a href="@Url.RouteUrl("Admin_Categories")">Categories</a></li> ==
<li><a href="~/Admin/Categories/Index">Categories</a></li>

如何从 url 中删除操作名称?

编辑 2

好的,所以我的浏览器以某种方式缓存了类别 Controller 索引操作 View 作为登录 Controller 索引操作 View 。清除浏览器缓存后问题解决了一段时间。我为所有 View 使用了以下缓存属性(仅对需要参数的 View 使用了 VarByParam):

[OutputCache(CacheProfile = "OneDayCache")]

但即使清除缓存也无法解决问题。我仍然被重定向到登录 Controller 索引操作...有什么想法吗?

编辑 3

我使用了那些 AreaRoutes:

context.MapRoute(
"Admin_Categories",
"Admin/Categories",
new { controller = "Categories", action = "Index", param = UrlParameter.Optional },
new[] { "AMBIT_CMS_MVC.Areas.Admin.Controllers" }
);

context.MapRoute(
"Admin_Default",
"Admin/{controller}/{action}/{param}",
new { controller = "Index", action = "Index", param = UrlParameter.Optional },
new[] { "AMBIT_CMS_MVC.Areas.Admin.Controllers" }
);

我用它来创建路由 url:

@Url.RouteUrl("Admin_Categories")

但仍然无法正常工作。管理路由已在 Global.asax 中注册,并且没有任何路由可以覆盖这些...

编辑 4

我发现我的问题是缓存。 Chrome 以某种方式将我的/Admin/Categories 位置缓存为/Admin/Login,因此当我点击 url/Admin/Categories 缓存时,它会将其重定向到/Admin/Login。

我使用了 OutputCache 属性,但它似乎无法正常工作。

[OutputCache(CacheProfile = "OneDayCache", VaryByCustom = "Url")]
public ActionResult Index(){...}

在 Global.asax 中设置 VaryByCustom:

public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg.Equals("Url"))
{
string url = !string.IsNullOrWhiteSpace(context.Request.Url.AbsoluteUri) ? context.Request.Url.AbsoluteUri : string.Empty;
return "Url=" + url;
}
return base.GetVaryByCustomString(context, arg);
}

http://localhost:50945/Admin/Categories
HTTP/1.1 302 Found
Cache-Control: private, max-age=86400
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2017 20:24:19 GMT
Last-Modified: Wed, 08 Feb 2017 20:24:19 GMT
Location: /Admin/Login
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXENhdGVnb3JpZXM=?=
X-Powered-By: ASP.NET
Date: Wed, 08 Feb 2017 20:24:19 GMT
Content-Length: 439

也许这个 VaryByCustom 不起作用。有什么解决办法吗?

最佳答案

对于您的第一次编辑:

第三个参数注册默认值。您缺少默认的操作

改变你的路线,它会工作:

context.MapRoute(
"Admin_Categories",
"Admin/Categories/{action}",
new { controller = "Categories", action = "Index" }
);

更好的解决方案:

为什么不简单地删除除此之外的所有内容:

context.MapRoute(
"Admin_Default",
"Admin/{controller}/{action}/{param}",
new { param = UrlParameter.Optional }
);

例如,这意味着请求 /Admin/Foo/Bar 像这样得到解决:

  • Admin区域找到FooController
  • 调用 Bar - 方法。

然后简单地使用它来生成 URL

@Url.Action("ActionName", "ControllerName", new { Area = "AreaName" })

你可能想要这个:

context.MapRoute(
"Admin_Default",
"Admin/{controller}/{action}/{param}",
new { controller = "Index", action = "Index", id = UrlParameter.Optional }
);

如果你打电话

@Url.Action("Index", "ControllerName", new { Area = "AreaName" })

生成的 Url 将是 /AreaName/ControllerName 而不是 /AreaName/ControllerName/Index

如果你打电话

@Url.Action("Index", "Index", new { Area = "AreaName" })

生成的 Url 将是 /AreaName 而不是 /AreaName/Index/Index

你应该一起使用这个 AreaRegistration:

public class AdminAreaRegistration : AreaRegistration 
{
public override string AreaName
{
get
{
return "Admin";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Index", action = "Index", id = UrlParameter.Optional }
);
}
}

仅在您确实需要时才创建新路线。然后不要忘记在 MapRoute 的第三个参数中设置默认值。

另请注意,如果您已经在同一 Controller 的 View 中,则编写操作就足够了:

@Url.Action("SomeAction")

如果你在同一区域的 View 中,但想调用另一个 Controller ,你可以这样写:

@Url.Action("SomeAction", "SomeController")

关于c# - ASP .NET MVC 区域注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com