MVC无法显示某些操作

时间:2016-03-25 12:48:01

标签: asp.net asp.net-mvc routes asp.net-mvc-areas

我正在开发一个ASP.NET MVC应用程序。内容分为几个方面:

  • Scheme - 用于共享功能,例如错误
  • 页面 - 显示内容
  • 数据 - 用于控制器,返回JSON数据

我没有任何控制器没有分配到区域。

我想在不输入区域名称的情况下访问Pages个控制器,而在路由中使用区域名称访问其他控制器。

所以我想在Users

下的Administration页面中显示操作host/Administration/Users

我想在DatabaseTimeout下的Error控制器中显示host/Scheme/Error/DatabaseTimeout动作。

类似地,我希望来自CreateCodes区域Data控制器的host/Data/Codes/Create动作。

现在,问题:Pages区域按预期工作,Data区域按预期工作,Scheme区域无法按预期工作。键入host/Scheme/Error/DatabaseTimeout时,应用程序返回404。

谁能告诉我出了什么问题?

以下是应用程序代码的一部分:

的Global.asax:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

RouteConfig.cs

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    }

DataAreaRegistration.cs

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Data_default",
            "Data/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MyWebApplication.Areas.Data.Controllers" }
        );
    }

PagesAreaRegistration.cs:

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Pages_default",
            "{controller}/{action}/{id}",
            new { controller="Home",  action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MyWebApplication.Areas.Pages.Controllers" }
        );
    }

SchemeAreaRegistration.cs:

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Scheme_default",
            "Scheme/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MyWebApplication.Areas.Scheme.Controllers" }
        );
    }

来自Pages区域的AdministrationController.cs:

namespace MyWebApplication.Areas.Pages.Controllers
{
    public class AdministrationController : Controller
    {
         // action methods...
    }
}

来自Data区域的CodesController.cs:

namespace MyWebApplication.Areas.GridData.Controllers
{
    public class CountryCodesController : Controller
    {
         // action methods...
    }
}

来自Scheme区域的ErrorController.cs:

namespace MyWebApplication.Areas.Scheme.Controllers
{
    public class ErrorController : Controller
    {
         // action methods...
    }
}

修改

好的,现在我真的很困惑。

所以在我Scheme区域内,除其他外:   - _Layout.cshtml文件,wchich是每个显示页面的母版页   - Menu.cshtml,它是Menu动作的视图,并在_Layout

上呈现

Menu视图由以下内容呈现:

@{Html.RenderAction("Index", "Menu", new { area="Scheme" });}

菜单呈现正常,但是......

在菜单中有许多操作链接,指向不同的页面,如下所示:

@Html.ActionLink("Manage users", "Users", "Administration", new { area = "Pages" }, null)

这就是这样的路线:host/Scheme/Administration/Users

尽管指定了区域。我试图将区域参数更改为区域="",没有帮助。

请帮助我,我很困惑,我不能继续我的工作。 :(

1 个答案:

答案 0 :(得分:0)

当您键入host/Scheme/Error/DatabaseTimeout时,应用程序可能返回404,因为您在Scheme区域的ErrorController.cs中没有动作DatabaseTimeout:

namespace MyWebApplication.Areas.Scheme.Controllers
{
    public class ErrorController : Controller
    {
         public ActionResult DatabaseTimeout()
         {
             return View();
         }
    }
}

您必须在Areas\Scheme\Views\Error\DatabaseTimeout.cshtml下的项目中创建用户显示错误的视图。

另一个问题 - >我认为,如果您想在Index()区域HomeController下创建一个指向行动Scheme的链接,则必须在视图中使用此链接:

@Html.ActionLink("Home", "Index", "Home", new { area = "Scheme" }, null)