Вид в областях не может быть расположен - Visual Studio 2015, C#, ASP.NET MVC 5

Я нашел много тем и предложений по этому вопросу, и я думаю, что перепробовал все комбинации.

У меня было рабочее приложение, которое будет расти больше, поэтому я решил использовать области. Я прошел через это и могу получить доступ к контроллерам, но затем приложение перестает работать, когда оно пытается вернуть данные в представление. Я создал тестовый контекст данных, классы и т. Д., Чтобы быть уверенным, что это не то, что я сделал неправильно при переходе в области.

Вероятно, лучше всего пройти через несколько меньшую тестовую ситуацию, а затем применить то, что работает, к большему реальному приложению.

Моя ссылка от _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);
        }
    }
}

Мой файл RouteConfig

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")] в контроллере; Я пробовал несколько вариантов с добавлением контроллера в файл регистрации области, удалением имени области перед контроллером в файле регистрации области и многими другими комбинациями.

Код находит контроллер и модель, когда я помещаю в них точки останова и достигаю их - когда он пытается вернуть представление, я получаю сообщение об ошибке о том, что представление индекса не найдено в стандартных местоположениях - он не выполняет поиск в областях в все.

Спасибо!

1 ответ

Решение

Я думаю, что у вас есть несоответствие в вашей настройке "соглашение по конфигурации". Может быть полезно добавить сообщение об ошибке и структуру вашего решения. Вы должны проверить, например, что Index.cshtml находится в папке Areas\test\Views\testclasses. Единственное, что я вижу на первый взгляд, это то, что вы не изменили свою ссылку действия, чтобы включить область. Тебе стоит попробовать:

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

PS> Я бы порекомендовал использовать обозначения верблюжьих букв для имен классов и областей... вы знаете, ради чистого кода. Не говоря уже о том, что вы никогда не знаете, когда можете наткнуться на соглашение с учетом регистра....

Другие вопросы по тегам