可选参数必须是引用类型、可为 null 的类型,或者声明为可选参数。参数名称:参数`

问题描述 投票:0回答:4

我正在.net MVC 中创建一个演示应用程序。

下面是我的 StudentController 的代码片段。

public ActionResult Edit(int studentId)
{
    var std = studentList.Where(s => s.StudentId == studentId).FirstOrDefault();
    return View(std);
}

[HttpPost]
public ActionResult Edit(Student std)
{
    //write code to update student 

    return RedirectToAction("Index");
}

来自 RouteConfig 的代码片段:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

当我点击 url

http://localhost:54977/student/Edit/1
时,我收到以下异常。

The parameters dictionary contains a null entry for parameter 'studentId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Edit(Int32)' in 'MVC1.Controllers.StudentController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters
.

但是当我点击 url 时效果很好

http://localhost:54976/student/Edit?StudentId=1

我是 .net MVC 的新手。有人可以建议我吗?

c# asp.net-mvc
4个回答
10
投票

问题是由于您的路由配置造成的。

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

http://localhost:54977/student/Edit/1中的第三个参数映射到{id}而不是studentId。

您有两种选择来解决问题:

1)更改参数名称

public ActionResult Edit(int id) { var std = studentList.Where(s => s.StudentId == id).FirstOrDefault(); return View(std); }

2)添加新的编辑路线:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "EditStudent", "Edit/{StudentId}", new { controller = "Student", action = "Edit" }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
    

0
投票
尝试将其添加到您的 RouteConfig 中

routes.MapRoute( "Student", // Route name "Edit/{StudentId}", // URL with parameters new { controller = "Student", action = "Edit" } // Parameter defaults );
    

0
投票
无需配置路由

$.ajax({ type: "POST", cache: false, url: '/Student/Edit?StudentId='1, dataType: 'json', ... ... ..
    

0
投票
当您推送网址 http://localhost:54977/student/Edit/1 时,您期望执行第一个操作 GET,但是调用了带有 [HttpPost] 标记的第二个操作,以解决此问题将您的请求类型从 POST 更改为 GET。

© www.soinside.com 2019 - 2024. All rights reserved.