【问题标题】:View in areas cannot be located - Visual Studio 2015, C#, ASP.NET MVC 5无法定位区域中的视图 - Visual Studio 2015、C#、ASP.NET MVC 5
【发布时间】:2017-11-08 00:20:20
【问题描述】:

我找到了很多关于这个的话题和建议,我想我已经尝试了所有的组合。

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

最好先完成较小的测试情况,然后将可行的方法应用于较大的实际应用程序。

我的链接来自_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; }
    }
}

我的 testAreaRegistration:

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")];我尝试了多种选择,将控制器添加到区域注册文件中,从区域注册文件中的控制器前面删除区域名称,以及许多其他组合。

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

谢谢!

【问题讨论】:

    标签: c# asp.net-mvc views areas


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!!我在 ActionLink 中尝试过该区域,但没有额外的 new{} 语句。{}这现在有效......但它确实破坏了我的共享布局链接(似乎一旦我使用 ActionLink 转换到新区域,它就会尝试在区域而不是在本机文件夹中。我会解决这个问题。关于骆驼案例 - 对于实际课程,我这样做......这只是一个快速而肮脏的测试,以获得一个新课程的干净测试,而不是我的那些已经搬到了一个新的区域。再次感谢您!
    • 修复 _Layout.cshtml 文件很简单——我只需要添加一个与上面相同样式的空白区域。
    • @Html.ActionLink("Contact", "Contact", "Home", new { area = "" }, new { })
    • 谢谢!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签