ASP.NET MVC项目中Request.Form返回null的问题求助
嘿,朋友,我瞅了下你贴的代码,针对Request.Form["selectedFood"]返回null的问题,给你几个实用的排查和解决方向,你挨个试试:
先确认表单的提交方式和元素命名:
首先得保证视图里的表单是用method="post"提交的,毕竟Request.Form只能获取POST请求的表单数据,要是用GET请求的话肯定拿不到值。另外,你用来传递食物名称的表单元素(比如下拉框、输入框)的name属性必须严格是selectedFood,大小写都得对,不然后台匹配不上。换成MVC原生的模型绑定,比Request.Form靠谱多了:
其实ASP.NET MVC里不推荐直接操作Request.Form,官方更推荐用模型绑定来接收表单数据,不仅代码更简洁,还能避免很多奇怪的问题。你可以把你的Action改成这样:[HttpPost] // 一定要加这个特性,限制这个方法只接受POST请求 public ActionResult AddFood(string selectedFood) { if (Session["uid"] != null) { string email = Session["uid"].ToString(); var user = HomeController.Users.FirstOrDefault(x => x.Email == email); if (!string.IsNullOrEmpty(selectedFood)) // 先判断下参数有没有传过来 { var selectedFoodItem = HomeController.Foods.FirstOrDefault(x => x.Name == selectedFood); if (selectedFoodItem != null) // 避免空引用异常 { user.Foods.Add(selectedFoodItem); } } } return RedirectToAction("Diet", "User"); }这样MVC框架会自动把表单里的
selectedFood值绑定到方法的参数上,比你自己去Request里取要稳很多。检查视图里的表单结构有没有嵌套:
要是你视图里的<form>标签是嵌套的(比如一个form里面又套了另一个form),浏览器只会提交其中一个表单的内容,很可能导致你要的参数传不到后台,这个坑我之前踩过,你赶紧检查下div里的表单结构有没有问题。确认表单的提交地址是否正确:
你得保证表单的action属性正确指向了AddFood方法,最好用@Url.Action("AddFood", "你的控制器名")来生成正确的提交地址,防止因为地址错了导致表单数据根本没传到目标Action里。
对了,顺便提一嘴,你直接访问HomeController.Users和HomeController.Foods这种静态集合的写法不太规范,后期维护容易出问题,不过先解决眼前的Request.Form问题为主!
你先按上面的方法排查,要是还不行的话,可以把视图里的表单代码贴出来,我再帮你瞅~
备注:内容来源于stack exchange,提问作者StraleS02

