Вид в областях не может быть расположен - 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> Я бы порекомендовал использовать обозначения верблюжьих букв для имен классов и областей... вы знаете, ради чистого кода. Не говоря уже о том, что вы никогда не знаете, когда можете наткнуться на соглашение с учетом регистра....