【问题标题】:(Edit/5) not working but (edit?id=5) working in MVC 5(Edit/5) 不工作但 (edit?id=5) 在 MVC 5 中工作
【发布时间】:2017-10-25 13:18:48
【问题描述】:

我刚开始学习 MVC,我试图将 studentId 作为参数传递给编辑页面。默认情况下,当您单击编辑链接时,它会转到:

 localhost:63348/student/Edit/5 

但它不起作用。它给了我这个错误

参数字典包含“WebApplication1.Controllers.StudentController”中方法“System.Web.Mvc.ActionResult Edit(Int32)”的不可空类型“System.Int32”的参数“StudentId”的空条目。

但如果我手动将其更改为:

 localhost:63348/student/Edit?studentid=5

它然后工作。他们应该意思相同并且工作方式几乎相同吗?

这是我的控制器:

public IList<Student>studentList = new List<Student>{
            new Student() { StudentId = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentId = 2, StudentName = "Steve",  Age = 21 } ,
            new Student() { StudentId = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentId = 4, StudentName = "Ram" , Age = 20 } ,
            new Student() { StudentId = 5, StudentName = "Ron" , Age = 31 } ,
            new Student() { StudentId = 6, StudentName = "Chris" , Age = 17 } ,
            new Student() { StudentId = 7, StudentName = "Rob" , Age = 19 }
        };

    [Route("Edit/{studentId:int")]
    public ActionResult Edit(int StudentId)
    {
        //Get the student from studentList sample collection 
        var std = studentList.Where(s => s.StudentId == StudentId).FirstOrDefault();

        return View(std);
    }

尝试添加特定的路由配置,但也没有用:

routes.MapRoute(
            name: "StudentEdit",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Student", action = "Edit", id = UrlParameter.Optional }
        );

【问题讨论】:

  • 两件事。首先,您的路线格式错误。 [Route("Edit/{studentId:int")]你错过了结束}。其次,您的路由参数与方法参数的名称不同。案件很重要。
  • @Amy,DefaultModelBinder区分大小写
  • 你需要在你的RouteConfig.cs中添加routes.MapMvcAttributeRoutes();routes.MapRoute(...)之前启用属性路由,并在你的控制器定义中添加[RoutePrefix("Student")]

标签: c# asp.net-mvc


【解决方案1】:

您需要添加属性[FromUri]并更正编译问题(提供右括号}并且参数名称不一样。

[Route("Edit/{studentId:int}")]
    public ActionResult Edit([FromUri] int studentId)
    {
        //Get the student from studentList sample collection 
        var std = studentList.Where(s => s.StudentId == StudentId).FirstOrDefault();

        return View(std);
    }

【讨论】:

  • FromUri 给了我一个错误。我更改了路线,确保它在大小写 [Route("Edit/{StudentId:int}")] 方面匹配,但仍然无法正常工作
  • @ElDj 你启用属性路由了吗?
  • 这样使用[Route("Edit/{StudentId}")]
  • 启用属性路由并删除了int 部分。现在,我收到资源未找到错误
  • 你是朝着正确方向迈出的一步。还要添加[HttpGet](或任何适合您情况的动词)。
最近更新 更多