奇怪的问题:ASP.NET MVC submit提交表单传入的模型实体对象为null和空值

前些天写代码的时候脑子突然短路了,遇到了一个纠结无比又奇怪的问题。在自己的ASP.NET MVC项目中,点击表单提交按钮submit提交数据,服务器后台方法总是接收不到表单提交上来的模型实体对象,显示为null或者空值。


首先具体的描述下我遇到的问题,在ASP.NET MVC的视图页面中,有个表单可以提交数据字段到后台控制器中,控制器接收提交字段数据的参数是一个模型实体对象。但是控制器始终无法获取到表单所提交的模型实体对象,参数对象一直为null值,编译器并没有报错,而且所提交的参数实体对象的字段名称也都正确,但是就是死活无法获取视图中表单所提交的字段。

视图中表单提交到控制器的类:

/// <summary>
/// 搜索实体
/// </summary>
public class SearchViewModel
{
    /// <summary>
    /// 搜索条件
    /// </summary>
    public string Search { get; set; }

    /// <summary>
    /// 当前页码
    /// </summary>
    public int Page { get; set; }
}

具体前端部分代码如下:

@using(Html.BeginForm("Index","Home",FormMethod.Post))
{
    <label>搜索内容:</label>        
    <input type="text" name="Search"/>
    <label>当前页数:</label>
    <input type="text" name="Page" value="1"/>
    <input type="submit" value="搜索"/>
} 

控制器代码如下:

[HttpPost]
public ActionResult Index(SearchViewModel search)
{
    return View(search);
}

然后我们在页面表单中输入相关数据,点击提交:

视图输入界面

在后台断点调试,发现接收的实体对象始终为空:

ASP.NET MVC 控制器Action方法实体参数始终为null值

后来纠结了老半天,出去散完步回来问题就解决了。

造成这个问题的主要原因是因为在MVC的表单提交字段中 ,所提交的Search字段和在控制器中的SearchViewModel实体参数search命名一样,由于MVC中表单提交的参数是不区分大小写的,在加上对应的类型不一样(Search字段为string类型,search对象为SearchViewModel实体类),因此命名冲突加上参数类型冲突导致MVC无法正确区别提交的数据。

在上面的代码中我们可以看到SearchViewModel实体类中有个Search属性,在视图界面中我们这个表单字段的文本输入控件代码:<input type="text" name="Search"/>

那么问题来了,看下控制器的接受的实体参数:SearchViewModel search。在视图中表单的Search字段所提交上去的是一个string类型的字段,但是我们在控制器中Action方法的search却是一个实体对象,所以命名一样导致始终无法正确区分参数类型,所接受到的参数对象就一直为null值了。

要解决这个问题要么修改SearchViewModel类的Search属性命名,要么修改控制器中Action方法的参数命名。建议修改Action方法的参数命名,最终我控制器的代码如下:

[HttpPost]
public ActionResult Index(SearchViewModel searchViewModel)
{
    return View(searchViewModel);
}

 




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98366.html

(0)
上一篇 2021年8月21日 00:12
下一篇 2021年8月21日 00:12

相关推荐

发表回复

登录后才能评论