【问题标题】:Asp.net MVC Layout - Routing Issue With AreasAsp.net MVC 布局 - 区域的路由问题
【发布时间】:2017-12-06 07:47:40
【问题描述】:

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

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

在我的项目中,我必须创建单独的用户登录。这是完全自定义的登录部分。 所以我所做的是通过调用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”、“主页”

现在用户界面会根据用户的情况动态更改。所以到这部分为止没有问题。

之后,我必须明智地使用 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 }

        );

    }

【问题讨论】:

  • 如果不想要面积法,则设置为null - @Url.Action("UICustomize", "Home", new { area = "" })
  • @StephenMuecke 我如何在这里设置它?这是我的 ajax 调用 url -- url: '@Url.Action("UICustomize", "Home")' 在这个区域自动更改为 url: '/ClientManagement/Home/UICustomize',
  • 阅读我的评论 - 添加new { area = "" },然后生成/Home/UICustomize。但是你为什么要为此使用 ajax 而不是使用@Html.Action() 来调用生成菜单/侧边栏的子操作?
  • 脚本中有location.href = "/Home/Login";这一事实表明您的代码存在其他设计问题。
  • @StephenMuecke ,哦,它的工作.. @Url.Action("UICustomize", "Home", new { area = "" }) 谢谢哥们.. :) 你能解释一下吗有可能。我不明白你对我说的话。 “但是你为什么要使用 ajax 而不是使用 @Html.Action() 来调用生成菜单/侧边栏的子操作?”

标签: ajax asp.net-mvc asp.net-mvc-4 routes


【解决方案1】:

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 = "" }); }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2011-07-03
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2018-05-31
    相关资源
    最近更新 更多