【问题标题】:MVC can't display certain actionsMVC 无法显示某些操作
【发布时间】:2016-07-13 05:28:08
【问题描述】:

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

  • 方案 - 用于错误等共享功能
  • 页面 - 用于显示的内容
  • 数据 - 对于控制器,返回 JSON 数据

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

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

所以我想在Administration页面下host/Administration/Users下显示动作Users

我想在host/Scheme/Error/DatabaseTimeout 下显示来自Error 控制器的DatabaseTimeout 操作。

类似地,我想要来自Codes 控制器的Create 动作来自Data 区域下的host/Data/Codes/Create

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

谁能告诉我怎么了?

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

全球.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

即使指定了区域。我试图将 area 参数更改为 area="",但没有帮助。

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

【问题讨论】:

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


    【解决方案1】:

    当您键入 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 下的项目中创建向用户显示错误的视图。

    另一个问题 --> 我认为如果你想在HomeController 下的Schemearea 中创建一个指向动作Index() 的链接,你必须在视图中使用它:

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

    【讨论】:

    • 我确实有动作定义,只是没有发布它以免引起噪音。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2014-08-17
    • 2016-11-14
    相关资源
    最近更新 更多