新的MVC 4项目。默认路由被忽略

时间:2013-11-04 12:44:46

标签: c# entity-framework asp.net-mvc-4 asp.net-mvc-routing url-routing

我刚刚创建了一个新的MVC 4项目,并使用Database First添加了一个EDO.NET实体数据模型。我不确定为什么,但事情似乎没有像过去那样正常运作。我不得不手动添加EF代码生成项来生成实体类。

无论如何,我遇到的主要问题是默认路由似乎被忽略了。 我的路由配置是默认配置,如下所示:

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

但是[LOCALHOST] / Properties /找不到/ Properties / Index,它只会在'/'应用程序中返回404服务器错误。 无法找到资源。

我不会因为犯了一些愚蠢的错误或遗忘了一些关键的东西而放弃我,但我已经搜索了StackOverflow和类似问题的互联网,但没有任何解决方案有任何帮助。如果有人知道为什么,我会感激正确的方向。

请求编辑:

我有3个控制器:

  1. 主页 - 未触及
  2. 帐户 - 未触动
  3. 属性 - 具有默认MVC CRUD操作(索引,详细信息,创建,编辑)
  4. 在IIS上托管但在VS的内部调试IIS上没有。

    @ Html.ActionLink(“属性”,“索引”,“属性”)在运行时生成http:// [localhost]:53909 /属性。但是,单击生成的链接会在“/”应用程序中显示“服务器错误”。 无法找到资源。“

    PropertiesController.cs(仅限索引操作)

    public class PropertiesController : Controller
    {
        private PropertyInfoEntities db = new PropertyInfoEntities();
    
        //
        // GET: /Properties/
    
        public ActionResult Index()
        {
            //Mapper.CreateMap<Property, PropertiesListViewModel>()
                //.ForMember(vm => vm.MainImageURL, m => m.MapFrom(u => (u.MainImageURL != null) ? u.MainImageURL : "User" + u.ID.ToString()))
            //    ;
            //List<PropertiesListViewModel> properties =
            //    Mapper.Map<List<Property>, List<PropertiesListViewModel>>(db.Properties.ToList());
            return View(db.Properties.Include(p => p.Currency).Include(p => p.Type).Include(p => p.Province).Include(p => p.Region).Include(p => p.SaleType).Include(p => p.Source).Include(p => p.Town).ToList());
        }
    }
    

    _Layout.cshtml

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title - My ASP.NET MVC Application</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <header>
            <div class="content-wrapper">
                <div class="float-left">
                    <p class="site-title">@Html.ActionLink("your logo here", "Index", "Home")</p>
                </div>
                <div class="float-right">
                    <section id="login">
                        @Html.Partial("_LoginPartial")
                    </section>
                    <nav>
                        <ul id="menu">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Properties", "Index", "Properties")</li>
                            <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                        </ul>
                    </nav>
                </div>
            </div>
        </header>
    ....
    

    编辑2: 即使有特定的路线,它仍然被忽略

    namespace ProjectName
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Properties",
                    "Properties/{action}/{id}",
                    new { controller = "Properties", action = "Index", id = UrlParameter.Optional }
                );
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }
    }
    

    干杯!

5 个答案:

答案 0 :(得分:3)

我尝试将PropertiesController的名称更改为Properties1Controller,并且路由完全正常。在进一步挖掘之后,我发现这是因为Properties is a Windows Reserved Keyword

无论如何,该问题的解决方案:不要使用保留关键字作为控制器名称。

奇怪地,/ Properties / Index的路由工作完全正常,并且/ Properties /的路由在生产IIS上完全正常工作,而不是用于开发。这使得解决问题变得更加困难,但最终还是设法实现了这个目标。

谢谢大家的帮助。

答案 1 :(得分:2)

默认路由意味着每个[localhost] / foo / bar请求都转发到FooController及其Bar操作,该操作必须返回一些现有的View。可能你没有其中的一些。
“defaults”参数设置默认控制器和操作名称,以防它们未在请求中指定(即http:// [localhost] /),因此在您的情况下,这将搜索HomeController及其Index操作。

答案 2 :(得分:2)

在Global.asax.cs文件中,您是否注册了路线?例如:

RouteConfig.RegisterRoutes(RouteTable.Routes);

答案 3 :(得分:2)

访问localhost/properties明确表示您要调用PropertiesController。如果您的意思是希望将其作为默认路由,则需要将路由配置更改为以下内容:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Properties", action = "Index", id = UrlParameter.Optional }
);

这将允许您直接从localhost调用它。但是,听起来好像你错过了.cshtml文件。您确定~/Views/Properties/Index.cshtml存在吗?

答案 4 :(得分:1)

属性控制器的命名空间是否与“ProjectNamespace.Controllers”约定匹配?如果您从其他源复制代码,则可能忘记更改控制器类的命名空间。