为什么这会给我一个对象空引用错误:
[HttpPost]
public ActionResult WriteNote(NotesModel note) //notes == null
{
SendToDB(note.Author, note.Title, note.Note);
return View(); //BREAKPOINT
}
[HttpPost]
public ActionResult WriteNote(NotesModel model) //model is not null
{
SendToDB(model.Author, model.Title, model.Note);
return View(); //BREAKPOINT
}
我花了大约2个小时试图找出什么是错的,我只是偶然发现了这一点,但不知道为什么这工作。无论我为对象选择什么名称都可以,但要注意…
谁能解释一下?
——编辑:
要重新创建此问题,请执行以下操作
创建一个新的ASP。. NET (Framework 4.8.1) MVC项目。创建一个名为NotesModel.cs"内容如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebsiteProject.Models
{
public class NotesModel
{
[Display(Name = "Author")]
public string Author { get; set; }
[Display(Name = "Title")]
public string Title { get; set; }
[Display(Name = "Note")]
public string Note { get; set; }
}
}
接下来创建一个名为"NotesController.cs"内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebsiteProject.Models;
using System.Windows;
namespace WebsiteProject.Controllers
{
public class NotesController : Controller
{
public ActionResult WriteNote()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult WriteNote(NotesModel note)
{
if (note == null) MessageBox.Show("IF YOU ARE SEEING THIS THEN note == NULL");
return View();
}
}
}
接下来转到NotesController.cs文件,右键单击public ActionResult WriteNote()
,选择"添加视图",选择"MVC 5视图"。
模板选择:Create
为模型类选择NotesModel
进入新创建的视图并启动webapp,填写三个文本框并提交。
现在您应该看到一个文本框告诉您备注== NULL,这显然是错误的,它应该从表单接收数据。
现在如果你找到NotesController.cs文件并替换
public ActionResult WriteNote(NotesModel note)
与
public ActionResult WriteNote(NotesModel somethingelse)
(同时在if
语句中将note
改为somethingelse
)
它将不再为空,并实际接收来自表单的数据。可以通过在if
语句中插入一个断点来检查这一点。而且消息框现在不应该弹出。
我希望这是足够详细的重现问题。
参数名与表单字段名匹配,因此不知道是需要包还是只需要字段。请确认作者或标题。
这是预期的行为。参数的名称由ASP使用。. NET来确定哪些表单元素映射到该参数。虽然您没有显示您的标记,但似乎您有一个(或多个)使用名称model
而不是note
的元素。
重命名参数或重命名HTML元素