MVC - 无法解析视图(控制器和视图在不同项目中)

6
我有一个由4个项目组成的解决方案:
  • AS.Core.Common(引用:Data,Web)
  • AS.Core.Controllers(引用:Common,Data,Web)
  • AS.Core.Data
  • AS.Core.Web(引用:Data)
在我的控制器中,无论我在哪里返回视图:

return View("~/Views/Home/Index.cshtml");

它会被标记为红色,并出现"Cannot resolve view '~/Views/Home/Index.cshtml'"错误。
这四个项目都可以成功构建,但是当我按下F5时,会出现以下错误:

服务器错误。

HTTP 404. 找不到资源。

说明: 您所请求的资源(或其某个依赖项)可能已被删除,其名称已更改或暂时不可用。请检查以下 URL,并确保它拼写正确。

请求的 URL: /

版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.17929

我该如何使我的控制器能够看到我的视图并正确解析它们?我认为这就是我收到404响应的原因。
我的Global.asax.cs如下所示:
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // Register the default hubs route: ~/signalr
        RouteTable.Routes.MapHubs();

        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

我的 RouteConfig.cs 文件(我添加了命名空间,但似乎没有起到帮助作用)。
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

这是我的HomeController.cs
public class HomeController : Controller
{
    public ActionResult Index()
    {
        //return View("~/Views/Home/Index.cshtml");
        return View();
    }
 }

问题可能不在于查找视图。如果未找到视图,则会产生其他更具体的错误,而不是404错误。您的错误可能与路由有关。global.asax中的路由表如何? - Max
我在原帖中添加了我的路由。 - Mithrilhall
抱歉,不够清楚 :) RouteConfig.RegisterRoutes(RouteTable.Routes) 方法中包含了什么内容? - Max
我猜你没有一个名为HomeController.cs的文件,其中包含一个名为HomeController且具有名为Index()的方法的类? - Max
我有一个名为HomeController.cs的文件,其中包含一个名为Index的方法。我已经将它添加到原始帖子中了。 - Mithrilhall
1
刚才看到(在另一个评论中)你的控制器在另一个项目中,对吗?那么你可能应该在MapRoute()中添加 *namespaces: new string[]{"YourControllerProjsNameSpace"}*。 - Max
1个回答

9
中,您可以在相应控制器的视图文件夹中返回有效的视图。例如,如果您有一个名为Product的控制器,您可以在路径~/Views/Product/Index.cshtml中拥有一个文件夹。在您的Index操作中,您只需使用所有asp.net mvc控制器都应该继承的Controller类基础的View()方法返回一个视图。例如:
public ActionResult Index()
{
   return View();
}

Asp.Net会在与您的操作名称相同的文件夹中找到视图,这种情况下是Index

您还可以使用View方法返回另一个视图,因为您在文件夹中拥有相应的视图,例如:

public ActionResult Index()
{
   return View("About");
}

考虑到这种情况,您应该在Product文件夹中有一个名为About的视图。例如:~/Views/Product/About.cshtml
如果您将控制器更改为另一个项目(类库),则必须在asp.net mvc初始化中设置控制器的默认命名空间,尝试在Global.asax文件和Application_Start方法中添加以下内容:
ControllerBuilder.Current.DefaultNamespaces.Add("NamespaceOfYourProject.Controllers");

请查看这篇文章: http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate-assemblies.aspx


我有一个名为"/Views/Home"的文件夹,其中包含一个名为'Index.cshtml'的文件。由于某种原因它无法解析。 - Mithrilhall
路由怎么样?你改了什么吗? - Felipe Oriani
我没有这样做,也许这就是我的问题所在?最初我的控制器在我的Web项目中,但我删除了该目录并为我的控制器创建了一个新项目。我将使用我的路由更新原始帖子。 - Mithrilhall
看看我的修改,也许那就是原因!Asp.Net MVC 没有找到正确的控制器。 - Felipe Oriani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接