Asp.net MVC 布局 - 区域的路由问题

Asp.net MVC Layout - Routing Issue With Areas

我遇到了 MVC 路由问题(或者至少我认为是 mvc 路由 :))...

这是我工作流程的详细信息

在我的项目中,我必须明智地创建单独的用户 login.this 是完全自定义的登录部分。 所以我所做的是通过调用 ajax 函数附加我的菜单栏 html , 该布局页面的 $(document).ready(function ())。

代码:

$(document).ready(function () {
        $("#divProcessing").show();
        $.ajax({
            url: '@Url.Action("UICustomize", "Home")',
            data: {
            },
            type: 'POST',
            cache: false,
            success: function (data) {

                if (data != '')
                {
                    $('#sidemenulist').append(data);
                    $("#divProcessing").hide();
                }
                else {
                    location.href = "/Home/Login";
                }

            }
        });
 });

"UICustomize","Home"

现在 UI 动态更改用户 wise.so - 到这部分没有问题。

之后,我必须明智地在 asp.net mvc 中使用 Area 来处理特定模块。 然后我遇到了问题。 在这个区域,我不能使用我的布局 ajax 功能,因为我的路径正在改变。

'/ClientManagement/Home/UICustomize'

我只想将该路径重定向到 Home/UICustomize。 怎么做到的?

路线如下: 路由配置

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Login", id = UrlParameter.Optional }
      );

面积

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

        );

    }

Url.Action() 将默认使用当前区域,这就是为什么它会生成带有您所在区域名称的 url 的原因。要删除它,请使用

$.ajax({
    url: '@Url.Action("UICustomize", "Home", new { area = "" })',
    ....

在您的情况下将生成 /Home/UICustomize 而不是 /ClientManagement/Home/UICustomize

但是您不应该使用 ajax 渲染侧边栏。相反,用 [ChildActionOnly] 属性装饰你的 UICustomize() 方法(这样它就不能被用户导航到),并在你的布局中使用

@Html.Action("UICustomize", "Home", new { area = "" })

@{ Html.RenderAction("UICustomize", "Home", new { area = "" }); }

渲染侧边栏菜单的局部视图。