我有一个使用MVC区域的项目。该区域包含整个项目,而区域外的主“视图/控制器/模型”文件夹为空,禁止我设置的调度控制器将默认传入请求路由到我所在区域的Home Controller。
该控制器有以下一种方法: -
public ActionResult Index(string id)
{
return RedirectToAction("Index", "Home", new {area = "xyz"});
}
我也有一个默认的路由设置来使用这个控制器,如下所示: -
routes.MapRoute(
"Default", // Default route
"{controller}/{action}/{id}",
new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional }
);
对我网站的任何默认请求都会适当地路由到相关区域。 Area的“RegisterArea”方法只有一条路线: -
context.MapRoute(
"xyz_default",
"xyz/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
我的区域有多个控制器,有很多视图。在这些控制器方法中对特定视图的任何调用,例如“return View(”blah“); 呈现正确的视图。然而,每当我尝试返回一个视图以及作为参数传入的模型对象时,我得到了 以下错误: -
Server Error in '/DeveloperPortal' Application.
The view 'blah' or its master was not found. The following locations were searched:
~/Views/Profile/blah.aspx
~/Views/Profile/blah.ascx
~/Views/Shared/blah.aspx
~/Views/Shared/blah.ascx
每当模型对象作为参数传入时,它就像。到“View()”方法[例如return View(“blah”,obj)]它搜索视图 在项目的根目录中而不是在区域特定的视图文件夹中。
我在这里缺少什么?
提前致谢。
答案 0 :(得分:8)
解决了!我的一些“RedirectToAction”调用没有在该方法的routeobject集合参数中明确指定区域名称。奇怪的是,即使控制器重定向都在同一区域,这也是必需的。此外,当我没有在其routeobject集合中指定新的{area =“blah”}时,HtmlActionLinks工作正常,所以我想知道为什么控制器动作调用RedirectToAction()需要,即使调用和被调用的控制器都行动都属于同一地区。
答案 1 :(得分:6)
如果您使用而不是
context.MapRoute(
"xyz_default",
"xyz/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
使用
context.MapRoute(
"xyz_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
中的
xyzAreaRegistration.cs
然后您不需要在任何链接中明确指定您的区域......
答案 2 :(得分:3)
如果这是路由问题,您可以通过先注册区域路由来解决此问题。这会导致路由引擎尝试匹配其中一个区域路由,然后匹配根路由:
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
如果我通过在我的区域应用程序中重命名我的一个视图文件夹来强制显示错误,则会出现与您不同的错误:
The view 'Index' or its master was not found. The following locations were searched: ~/Areas/xyz/Views/Document/Index.aspx ~/Areas/xyz/Views/Document/Index.ascx ~/Areas/xyz/Views/Shared/Index.aspx ~/Areas/xyz/Views/Shared/Index.ascx ...and then the usual root view folders..
..如果它认为它在一个区域内,它将搜索的子目录模式。
答案 3 :(得分:2)
检查 MyArea AreaRegistration.cs中生成的代码,并确保将控制器参数设置为默认控制器,否则控制器将因某种原因被称为bot,ASP.NET MVC将不会在区域文件夹中搜索视图
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"SomeArea_default",
"SomeArea/{controller}/{action}/{id}",
new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
);
}
答案 4 :(得分:2)
在Controller类上添加RouteArea属性,以便MVC知道使用" XYZ"视图区域(然后您可以将AreaPrefix设置为空字符串,因此路径不需要以" XYZ"开头)。
[[oddy1, minino1, libertad1],[oddy2, minino2, libertad2],[oddy3, minino3, libertad3]]
答案 5 :(得分:1)
我遇到了同样的问题并通过将ascx的“Build Action”属性设置为“Embedded Resource”来解决它。
答案 6 :(得分:1)
试试这段代码。在区域注册文件中进行更改...
context.MapRoute(
"YourRouteName", // Route name //
"MyAreaName/MyController/{action}", // URL with parameters //
new {
controller = "MyControllerName",
action = "MyActionName", meetId = UrlParameter.Optional
}, // Parameter defaults
new[] { "Your Namespace name" }
);
答案 7 :(得分:1)
对于那些正在寻找.net核心解决方案的人,请使用
app.UseMvc(routes =>
{
routes.MapRoute(
name : "areas",
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
});`
如果您在主项目中有一些代码,而在区域中有一些代码,请使用以下代码。
app.UseMvc(routes => {
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
请注意确保您已在控制器中定义了区域
[Area("Test")]
public class TestController : Controller
{
public IActionResult Index()
{
return View();
}
}
}