大概执行过程是这样的,我一开始访问Send页面,Send页面的Model类型为SmsRecord,然后Send页面提交到[HttpPost] Send() 方法里面,Send() 方法再返回到 Send页面,但是没有传递Model,按理说应该在Send页面使用Model的时候报空引用异常,但是现在报错的位置不在我预想的位置,发上代码和截图,大家帮忙看看,我想知道为什么下面那一行代码那里会报错,谢谢大家了。
Controller: public ActionResult Send() { SmsRecord smsConfig = new SmsRecord() { ObjectId = 123, Phone = "15101101111", DataSource = 1, SmsContent = string.Empty }; ViewData.Model = smsConfig; return View(); } [HttpPost] public ActionResult Send(string name) { SmsRecord smsConfig = new SmsRecord() { ObjectId = 0, Phone = string.Empty, DataSource = 0, SmsContent = string.Empty }; return View(); } View: @model SmsRecord @{ Layout = null; var errorInfo = ViewData["error"] ?? string.Empty; } <form action="/Result/Send" method="POST"> <input type="text" name="name" value="@Model.Phone" readonly="readonly"/> <input type="submit" value="发送" /> </form>
我第一次运行是不会报错的,errorInfo的值为空,提交之后再返回Send页面就会报错,大神们,都说说想法啊。在线等,急急急!
var errorInfo = ViewData["error"] ?? string.Empty;
我后台没有给ViewData["error"]赋值,他应该为null对吧,如果他为null的话,我这句代码的执行结果应该是errorInfo="";,可是现在执行[HttpPost]Send方法返回视图的时候他报错了,为什么?
谢谢各位园友的回答,这个问题我暂时还没有搞清楚,我下去再试一试,等忙完手头上的活再来提问,谢谢大家了!
其实这个错误根本不是由var errorInfo = ViewData["error"] ?? string.Empty;产生的空引用异常,而是在我第二次返回视图的时候,没有给视图所需的Model,所以产生了空引用异常,至于为什么在var errorInfo = ViewData["error"] ?? string.Empty;这一行报错,是因为在视图中我指定了Model的类型,@model SmsRecord,视图中有用到了Model里面的值,从而产生的空引用异常,又因为var errorInfo = ViewData["error"] ?? string.Empty;这句代码会在前面执行,所以VS就提示这句代码发生了异常,其实不是因为这句代码本身发生的异常,如果你删除了这句代码,那么VS就会报Layout = null;这句代码发生异常,如果把Layout = null;这句代码也删除,那么VS会在返回到视图之后直接报异常。
能不能把报错的截图发下?
最下面不是错误截图吗?
var errorInfo = ViewData["error"] ?? string.Empty;
没见过这样写的,
string errorInfo= ViewData["error"] == null ? string.Empty;
还有你这个ViewData["error"] 没有地方赋值过吗?
?? 是对象为null的时候给默认值。
@过山车: 我这个例子删减过,但是就是我发出来的代码也会报这个错。
var errorInfo = ViewData["error"] ?? string.Empty;
这样子写貌似会直接把ViewData["error"] ToString,你没赋值,所以会报错。
但是我第一次运行的时候也会走这个啊,他就不会报错。
null
我知道 ViewData["error"] 是null,但是我不是处理了吗,为什么还报错?
你只是默认给了一个值 并没有处理为空的情况呀
为空没关系啊,我的errorInfo可以为空啊。
ViewData["error"]你在后台没有给值,都没有传到前台过去,怎么取?
我不是这样写的吗?var errorInfo = ViewData["error"] ?? string.Empty;
我后台没有给ViewData["error"]赋值,他应该为null对吧,如果他为null的话,我这句代码的执行结果应该是errorInfo="";,可是现在执行[HttpPost]Send方法返回视图的时候他报错了,为什么?
@晓菜鸟: 当然不行,前部分也是隐含的进行了ViewData["error"]==null的判断,就已经报错了
@Halower: 第一:ViewData["error"]==null 怎么会报错?
第二:我在Send() [HttpPost] 方法里面给ViewData["error"]赋值了还是报同样的错,怎么解释?ViewData["error"] = "晓菜鸟";
@晓菜鸟:ViewData["error"] = "晓菜鸟";你要写在[HttpGet]里面传到页面,再由页面提交到[HttpPost]
@Halower: 我想知道的是var errorInfo = ViewData["error"] ?? string.Empty;为什么会报错?你的意思是不是说我这个ViewData["error"] 没赋值所以报错对吗?但是我在[HttpGet]里面也没有赋值,但是运行完全没问题,为何我从[HttpPost]方法里面返回Send视图这句代码就报错了?
@晓菜鸟: 我在你邮箱留了我的qq,晚上远程给你说吧,感觉你不理解我的意思。
@Halower: 嗯,好的。
@Halower: 昨天晚上网卡卡的,不好意思啊!
ViewData["Model"] 和ViewBag.Model是不一样的。
cshtml中的报错信息不是很准确,建议检查 aaa == null
可是我没有使用ViewBag啊!求指教。
@晓菜鸟:
ViewBag.Model = new { ID=1, Name= 2 };
ViewData["Model"] = new object();
ViewData.Model = new object();
@爱上老鼠的pug: ???什么意思?不太明白。
@晓菜鸟: 使用前先赋值。你下面的HTML中有一个NULL值的地方,报错了。显示在C#代码的最后一行。
@爱上老鼠的pug: 你们都是这么说,但是我还是不理解,我先去看看吧,谢谢了!
ViewData["error"]没赋值,所以报错啦
var errorInfo = ViewData["error"] ?? string.Empty;
我后台没有给ViewData["error"]赋值,他应该为null对吧,如果他为null的话, ViewData["error"] ?? string.Empty 我这句代码的执行结果应该是errorInfo="";,可是现在执行[HttpPost]Send方法返回视图的时候他报错了,为什么?