asp.net mvc 5 actionlink 404错误与Area

时间:2018-01-23 16:32:47

标签: asp.net asp.net-mvc-5 actionlink asp.net-mvc-areas

**我在 TeacherArea / Home / Index 之类的路径中有一个index.cshtml,其中我有以下actionlink:**

@Html.ActionLink("Edit", "EditTeachers", "Home", new { Area = "TeacherArea", id = item.id }, new { }) 

目的是编辑简单的表格行数据。 我的家庭控制器看起来像这样:

namespace DemoProject2MVC.Areas.TeacherArea.Controllers
 [RouteArea("TeacherArea")]
        [RoutePrefix("TeacherArea/Home")]
        public class HomeController : Controller
        {
            return view();
        }

    [Route("EditTeachers")]
            public ActionResult Edit(int id)
            {           
                    MyDBContext stn = new MyDBContext();
                    Teacher tchr = stn.Teacher.Where(a => a.id == id).FirstOrDefault();
                return View(tchr);      
        }

**我还在区域内存在的控制器类的“TeacherAreaAreaRegistration”中设置了名称空间,如下所示:**

 public class TeacherAreaAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "TeacherArea";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "TeacherArea_default",
                "TeacherArea/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "DemoProject2MVC.Areas.TeacherArea.Controllers" }
            );
        }
    }

我也有这样的global.asax:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            DataAccessLayer.StartUpClass.Start();
        }

我的问题是: 索引操作方法在此提到的区域内正常调用。但是调用Edit Action方法的actionlink正在抛出404。

  

https://localhost:44336/TeacherArea/Home/EditTeachers/7

2 个答案:

答案 0 :(得分:1)

我可能在MVC上有点生疏,但我认为如果你想在启动时混合基于属性的区域声明/路由与区域/路由注册,你需要确保以正确的顺序注册东西。

我注意到的另一件事是你在创业公司中永远不会打电话给RouteTable.Routes.MapMvcAttributeRoutes(); - 这是故意的吗?

  

如果您同时使用具有路由属性的区域和具有基于约定的路由的区域(由AreaRegistration类设置),则需要确保在配置MVC属性路由后发生区域注册,但是在默认约定之前 - 基于路线设定。原因是路由注册应该从最具体(属性)到更通用(区域注册)到雾通用(默认路由)进行排序,以避免通用路由通过过早匹配传入请求来“隐藏”更具体的路由。管道。

MSDN

答案 1 :(得分:0)

也许你可以尝试Ajax方法..

        return $.ajax({
            type: 'POST',
            url: '<URL you want>',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: JSON.stringify({ Id: id}),
            success: function (data) { 
                     ...
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                     ...
            }
        });

和你的控制器

[HttpPost]
public JsonResult EditTeachers(int Id)
            {           
                    MyDBContext stn = new MyDBContext();
                    Teacher tchr = stn.Teacher.Where(a => a.id == id).FirstOrDefault();
                return Json(tchr, JsonRequestBehavior.AllowGet);      
        }

调试可能更容易,因为您可以通过检查网络来查看Ajax请求的来源。

希望有所帮助