无法定位区域中的视图 - Visual Studio 2015,C#,ASP.NET MVC 5

View in areas cannot be located - Visual Studio 2015, C#, ASP.NET MVC 5

我发现了很多关于此的主题和建议,我想我已经尝试了所有的组合。

我有一个正在运行的应用程序,它会变得越来越大,所以我决定使用区域。我通过了它并且可以访问控制器但是当它尝试将 return 数据添加到视图时应用程序失败了。我创建了一个测试数据上下文,类,等等,然后确保这不是我在进入区域时做错的事情。

最好先完成较小的测试情况,然后将有效的方法应用到较大的实际应用程序中。

我的 link 来自 _Layout.cshtml:

<li><a href="#">@Html.ActionLink("Test", "Index", "testclasses")</a></li>

我的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Tracking.Areas.test.Models
{
    public class testclass
    {
        public int ID { get; set; }
    }
}

我的测试区注册:

using System.Web.Mvc;

namespace Tracking.Areas.test
{
    public class testAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "test";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "test_default",
                //"test/{controller}/{action}/{id}",
                "test/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

我的测试控制器:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Tracking.Areas.test.Models;
using Tracking.DAL.Test;

namespace Tracking.Areas.test.Controllers
{
    [RouteArea("test")]
    public class testclassesController : Controller
    {
        private testcontext db = new testcontext();

        // GET: test/testclasses
        public async Task<ActionResult> Index()
        {
            return View(await db.spas.ToListAsync());
        }

        // GET: test/testclasses/Details/5
        public async Task<ActionResult> Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            testclass testclass = await db.spas.FindAsync(id);
            if (testclass == null)
            {
                return HttpNotFound();
            }
            return View(testclass);
        }

        // GET: test/testclasses/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: test/testclasses/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include = "ID")] testclass testclass)
        {
            if (ModelState.IsValid)
            {
                db.spas.Add(testclass);
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

            return View(testclass);
        }

        // GET: test/testclasses/Edit/5
        public async Task<ActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            testclass testclass = await db.spas.FindAsync(id);
            if (testclass == null)
            {
                return HttpNotFound();
            }
            return View(testclass);
        }

        // POST: test/testclasses/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit([Bind(Include = "ID")] testclass testclass)
        {
            if (ModelState.IsValid)
            {
                db.Entry(testclass).State = EntityState.Modified;
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(testclass);
        }

        // GET: test/testclasses/Delete/5
        public async Task<ActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            testclass testclass = await db.spas.FindAsync(id);

            if (testclass == null)
            {
                return HttpNotFound();
            }
            return View(testclass);
        }

        // POST: test/testclasses/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> DeleteConfirmed(int id)
        {
            testclass testclass = await db.spas.FindAsync(id);
            db.spas.Remove(testclass);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

我的路由配置文件

namespace Tracking
{
    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 }
            );
        }
    }
}

我的Global.asax.cs文件

namespace Tracking
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

我试过在控制器中使用和不使用 [RouteArea("test")];我已经尝试了多种选择,包括将控制器添加到区域注册文件、从区域注册文件中的控制器前面删除区域名称,以及许多其他组合。

当我在其中放置断点并到达它们时,代码会找到控制器和模型 - 当它尝试 return 视图时,我收到有关在标准位置找不到索引视图的错误消息 -它根本不在区域内搜索。

谢谢!

我认为您的 "convention over configuration" 设置不一致。添加错误消息和您的解决方案结构可能会有所帮助。例如,您应该检查是否在 Areas\test\Views\testclasses 文件夹中找到了 Index.cshtml。我第一眼看到的唯一一件事是您没有修改您的操作 link 以包含该区域。你应该试试:

@Html.ActionLink("Test", "Index", "testclasses", new { Area = "test" }, new{})

P.S.> 我建议对 class 名称和区域使用驼峰式命名法……你知道,为了代码简洁。更不用说您永远不知道什么时候会偶然发现区分大小写的约定....