我刚刚创建了一个新的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个控制器:
在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 }
);
}
}
}
干杯!
答案 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”约定匹配?如果您从其他源复制代码,则可能忘记更改控制器类的命名空间。