前些天写代码的时候脑子突然短路了,遇到了一个纠结无比又奇怪的问题。在自己的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);
}
然后我们在页面表单中输入相关数据,点击提交:
在后台断点调试,发现接收的实体对象始终为空:
后来纠结了老半天,出去散完步回来问题就解决了。
造成这个问题的主要原因是因为在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);
}
作者:十有三
出处:https://shiyousan.com/post/635521286210598952
版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。