【问题标题】:Areas Routing in MVC 4 with angularjs带有 angularjs 的 MVC 4 中的区域路由
【发布时间】:2017-04-08 05:06:51
【问题描述】:

让我在这里定义我的设置。我有一些区域,例如 1. AreaA 2. AreaB 3. AreaC 和 4. AreaGeneral。在 AreaGeneral 中,我有一个控制器作为 home 和 GetData(paras),它以部分或整页的形式将一些数据返回给 angularjs。如果我在 AreaGeneral 中使用这两个控制器,则可以。但我想在 A、B 和 AreaC 等其他区域内提供相同的控制器,但区域和路线不同。更重要的是,当用户导航到特定区域说 AreaB 以访问 GetData(paras) 控制器时,url 应该像 .../AreaB/GetData 而不是 .../AreaGeneral/GetData 并且该路由应该在其他区域工作好吧。谁能指导我如何做到这一点,谢谢。

【问题讨论】:

  • GetData 是可路由的操作吗?让各种控制器通过 ajax 调用相同的操作或让它们从 BaseController 类继承操作可能更有意义。
  • 能否请您更清楚地说明这一点,或者更好地向我解释我如何才能做到这一点。或者一个例子会更好
  • 如果没有控制器代码/区域结构的示例,我不确定我是否能准确地弄清楚你想要做什么。
  • 就像我上面解释的那样,我的应用程序中有多个区域,如果我必须在一个区域创建报告/表单,那么如果我的应用程序需要相同的报告/表单在另一个区域可用然后我必须重新设计它(或复制我不想复制的粘贴)。取而代之的是,我可以通过将 url 名称反映到我所在的同一区域来从该区域到任何其他区域创建相同的已定义控制器。
  • @Khan 我想看看你的 GetData 函数如何在控制器中调用它,如果你编写单独的服务然后在控制器中注入服务

标签: c# angularjs asp.net-mvc model-view-controller


【解决方案1】:

假设您已经定义了 AreaGeneral 路线,如下所示:

public class AreaGeneralAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "AreaGeneral";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "AreaGeneral_default",
            "AreaGeneral/{controller}/{action}/{id}",
            new { controller = "Home", action = "GetData", id = UrlParameter.Optional }
        );
    }
}

您可以在AreaB中注册该路线:

public class AreaBAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
        get { return "AreaB"; } 
    } 
    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "AreaB_Getdata",
            "AreaB/Home/Getdata",
            new { controller = "Home", action = "GetData" },
            new string[] { "areastest.Areas.AreaGeneral.Controllers" }).DataTokens["area"] = "AreaGeneral";

        context.MapRoute(
            "AreaB_default", 
            "AreaB/{controller}/{actio‌​n}/{id}", 
            new { action = "Index", id = UrlParameter.Optional });

    }
}

以便用户可以导航到 .../AreaB/Home/GetData 并查看在 AreaGeneral 中实际处理的页面。

【讨论】:

  • 感谢回复,不过我不用继承控制器什么的。
  • 不,B区不会有控制器。
  • 那么url呢,当从AreaB访问GetData时,它会变为.../AreaGeneral/GetData还是保持为.../AreaB/GetData
  • 不,网址将保持不变。 :)
  • 谢谢 Bob,今天让我检查一下,然后我会回来找你的。
【解决方案2】:

我在不同的 MVC 领域使用了角度服务,因为我使用了以下方式

如果你的项目结构应该像下面这样

  >ProjectName
  >Areas
       >AreaGeneral >controllername >GetData(function)
       >AreaA 
       >AreaB 
       >AreaC 

如果您的服务喜欢

 app.service("yourService", ["$http",function ($http) {
    this.GetData= function () {       
    var c = $http({
        method: "post", 
        url:"../AreaGeneral/controllername/GetData",
        data: "{}",
         dataType: "json"
         });
    return c
} }])

如果您在 AreaGeneral 内部使用,那么 网址"../AreaGeneral/controllername/GetData" 好的

但是当使用不同的区域比如AreaA

"../AreaGeneral/controllername/GetData"它在AreaA里面搜索,这样你就不会得到结果

解决方案对我来说就像调用函数一样,根据根目录结构添加额外的../ 这样

"../../../AreaGeneral/controllername/GetData"

然后每次调用 getdata 函数时,它都会从根目录检查,这样您就可以在任何区域使用 Getdata 函数

希望对您有所帮助。

【讨论】:

  • 好的。但是 GetData 视图怎么样,我是否必须在要使用相同功能的每个区域上复制相同的视图。看到我的意图是我想在不同的区域使用相同的视图和相同的控制器而不重写重复的代码,是否可能。
  • 有人可以告诉我,我如何在另一个区域内使用具有视图的同一个控制器,而无需重新编写视图和控制器。
  • 使用 ng-include 访问不同区域的视图
  • 任何用于 ng-include 的 Pravin 示例,包括区域、控制器和视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多