我有两个模型 - 类别和文章。我有两个相同的删除视图和控制器。唯一的区别是它适用于类别,但有文章我在HttpPost上得到空模型。
分类
public ActionResult DeleteCat(int id)
{
Category cat = db.CategoryByID(id);
if (cat != null)
{
return View(cat);
}
return RedirectToAction("Index");
}
[HttpPost]
public ActionResult DeleteCat(Category model)
{
db.DeleteCategory(model.CategoryID);
return RedirectToAction("Index");
}
文章:
public ActionResult Delete(int id)
{
Article art = db.ArticleByID(id);
if (art != null)
{
return View(art);
}
return RedirectToAction("Index");
}
[HttpPost]
public ActionResult Delete(Article model)
{
db.DeleteArticle(model.ArticleID);
return RedirectToAction("Index");
}
这两个视图都是由Visual Studio生成的,我没有更改它们。当我想删除一个类别时,一切顺利。但是当我想要删除一篇文章时,它首先从数据库中正确选择,然后显示视图(一切正常)但是当我单击删除按钮时模型为空(所有属性都是0,null或false)和所以db.DeleteArticle抛出一个异常(没有ArticleID = 0的文章)。任何人都可以向我提供任何关于我应该检查什么或者我应该如何解决这个问题的提示?
答案 0 :(得分:17)
如果[HttpPost] Action中模型的参数与模型中的属性名称相同,则它将为null,并且验证失败,表示该字段无效。
示例:
public class ContactMessage {
public string Name { get; set; }
public string sankdmfskm { get; set; }
}
[HttpPost]
public ActionResult Index(ContactMessage sankdmfskm)
{
...
}
sankdmfskm
将为null
。
尝试过MVC3和MVC4。
答案 1 :(得分:12)
有同样的问题。我在模型中的一个属性称为 model
public String model { get; set; }
将属性重命名为 myModel 。模型对象在ActionResult
中停止返回null答案 2 :(得分:11)
确保您的模型将其属性标记为属性(如果使用VB或带有get / set的C#),而不是公共字段...... MVC将不会映射到公共字段,而是映射到公共属性。
答案 3 :(得分:6)
有两种主要方式可以实现。
一种方法是您使用自定义模型绑定。我假设您正在开箱即用,所以这不适用。
最可能的问题是数据没有获得POST。确保字段 in 与Delete按钮POST的相同Form
。答案 4 :(得分:2)
我和你有同样的问题。我做了你的情况
[HttpPost]
public ActionResult Index(ContactMessage sankdmfskm)
{
UpdateModel(sankdmfskm);
...
}
模型更新后,它返回了正确的值,而不是null。
答案 5 :(得分:0)
我添加了一个答案,因为它与其他人不同,有人可能觉得它很有用。
我有一个BaseViewModel,因为我在一个视图中使用了多个模型。
在我的Controller Action上,而不是传递BaseViewModel(以及类似model.RegistrationModel.Username的参数),我传递了RegistrationFormModel,因此它没有绑定到我在视图中使用的BaseViewModel
请参阅img - 我遇到的问题是我将RegistrationModel传递给Post操作,而不是View中使用的BaseAuthenticationModel(它包含RegistrationModel)。所以绑定没有正确发生