14

我有一个使用 MVC 区域的项目。该区域包含整个项目,而区域外部的主要“视图/控制器/模型”文件夹为空,除非调度控制器我已设置将默认传入请求路由到我所在区域的主控制器。

该控制器具有以下一种方法:-

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 }
        );   

对我的站点的任何默认请求都会适当地路由到相关区域。该区域的“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)],它在项目的根目录中搜索视图,而不是在特定区域的视图文件夹中。

我在这里想念什么?

提前致谢。

4

8 回答 8

8

解决了 !我的几个“RedirectToAction”调用没有在该方法的 routeobject 集合参数中明确指定区域名称。奇怪的是,即使控制器重定向都在同一个区域,这是必需的。此外,当我没有在其 routeobject 集合中指定新的 {area="blah"} 时,HtmlActionLinks 工作正常,所以我想知道为什么对 RedirectToAction() 的控制器操作调用需要它,即使调用和被调用的控制器操作都需要都在同一个区域内。

于 2010-04-13T20:14:57.647 回答
7

如果您使用而不是

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

那么您无需在任何链接中明确指定您的区域...

于 2013-11-18T08:54:01.550 回答
5

在 Controller 类上添加 RouteArea 属性,以便 MVC 知道将“XYZ”区域用于视图(然后您可以将 AreaPrefix 设置为空字符串,因此路由不需要以“XYZ”开头)。

[RouteArea("Xyz", AreaPrefix = "")]
public class XyzController : Controller   
{
...
}
于 2017-03-08T17:45:58.110 回答
4

如果这是一个路由问题,您可以通过先注册您的区域路由来解决它。这会导致路由引擎在匹配根路由之前尝试匹配区域路由之一:

AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);

如果我通过重命名我的区域应用程序中的一个视图文件夹来强制出错,我会收到与您的不同的错误:

未找到视图“索引”或其主视图。以下地点
  被搜索:

~/Areas/xyz/Views/Document/Index.aspx
~/Areas/xyz/Views/Document/Index.ascx
~/Areas/xyz/Views/Shared/Index.aspx
~/Areas/xyz/Views/Shared/Index.ascx

...然后是通常的根视图文件夹..

..如果它认为它在一个区域中,它会搜索子目录的模式。

于 2010-04-12T20:44:01.300 回答
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 }
        );
    }
于 2010-06-06T20:07:30.613 回答
1

我刚刚遇到了同样的问题,并通过将 ascx 的“构建操作”属性设置为“嵌入式资源”来解决它。

于 2010-12-10T14:19:42.347 回答
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" }
);
于 2012-06-29T10:35:00.277 回答
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();
    }
}

}

于 2019-10-03T15:28:23.080 回答