MVC 3 - 新区域 - 404错误 - 未找到资源 - 已尝试路由调试器

时间:2010-12-21 14:14:25

标签: asp.net-mvc model-view-controller routing http-status-code-404 asp.net-mvc-3

我有一个小型MVC 3应用程序 - 一个演示场地。 我有一个区域,并且工作正常。

我刚刚添加了另一个区域,希望只是启动应用程序并且它可以正常工作 - 但是没有,404 - 无法找到资源。

AreaRegistration中的地图路线是默认值(就像我创建的第一个区域一样)。

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

我尝试在这个中添加一个特定的控制器,但没有。

所以我下载了Phil Haack的RouteDebugger,当我输入http://server/Postcard/Create时,找到了我的路线(这也是我想要的地方)

区域结构

alt text

我的控制器

    public class CreateController : Controller
{
    private ILogger Logger { get; set; }
    private ICardSender Emailer { get; set; }
    private IOCCardRepository CardRepository { get; set; }

    public CreateController(ILogger logger, ICardSender cardSender, IOCCardRepository repository)
    {
        this.Logger = logger;
        this.Emailer = cardSender;
        this.CardRepository = repository;
    }


    //
    // GET: /Postcard/Create/

    public ActionResult Index()
    {
        var model = new OCPostcardModel().Create();

        return View(model);
    }

现在:我已经删除了整个区域,再次尝试它没有用。所以我添加了路由中的特定控制器(Inside AreaRegistration文件)

context.MapRoute(
            "Postcard_default",
            "Postcard/{controller}/{action}/{id}",
            new { controller = "Create", action = "Index", id = UrlParameter.Optional }
        );

它的工作......我不知道为什么以前这样做不起作用,但现在就是这样。

仍然很好奇,因为我没有看到任何人在我看过的任何一个演示中添加这个控制器进入路线 - 我还没有在我的其他区域得到它?

3 个答案:

答案 0 :(得分:31)

当我将控制器移动到某个区域但忘记更新命名空间时,我遇到了这个问题。控制器名称的范围限定为Area的命名空间。所以“Area”中的“Some”将映射到App.Areas.Area.Controllers.SomeController,它不存在。

答案 1 :(得分:3)

您错过了maproute中的控制器部分

答案 2 :(得分:0)

尝试在PostCard区域

下添加一个PostCardAreaRegistration类
using System.Web.Mvc;

namespace Areas.PostCard
{
    public class PostCardAreaRegistration: AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "PostCard";
            }
        }

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