MVC3 - 帖子上的模型为空

jak*_*jak 15 c# razor asp.net-mvc-3

我有两个模型 - 类别和文章.我有两个相同的删除视图和控制器.唯一的区别是它适用于类别,但有文章我在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");
    }
Run Code Online (Sandbox Code Playgroud)

文章:

    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");
    }
Run Code Online (Sandbox Code Playgroud)

这两个视图都是由Visual Studio生成的,我没有更改它们.当我想删除一个类别时,一切顺利.但是当我想要删除一篇文章时,它首先从数据库中正确选择,然后显示视图(一切正常)但是当我单击删除按钮时模型为空(所有属性都是0,null或false)和所以db.DeleteArticle抛出一个异常(没有ArticleID = 0的文章).谁能请我提供任何关于我应该检查什么或者我应该如何解决这个问题的提示?

小智 17

如果[HttpPost] Action中模型的参数与模型中的属性名称相同,则它将为null,并且将无法验证该字段是否无效.

例:

public class ContactMessage {
    public string Name { get; set; }
    public string sankdmfskm { get; set; }
}

[HttpPost]
public ActionResult Index(ContactMessage sankdmfskm)
{
...
}
Run Code Online (Sandbox Code Playgroud)

sankdmfskm会的null.

尝试过MVC3和MVC4.


adi*_*nas 12

有同样的问题.我在模型中的一个属性称为模型

public String model { get; set; }
Run Code Online (Sandbox Code Playgroud)

将属性重命名为myModel后.模型对象在ActionResult中停止返回null

  • 这实在是太随意了!我不敢相信这样的错误存在,而且还没有解决! (2认同)
  • 我的参数名为name,导致同样的问题.谢谢! (2认同)
  • 很好的答案!这里有类似的问题,因为我无法让它工作,所以我正在拔头发。您的回答将我引向正确的方向。我正在使用类似 public ShippingDetails ShippingDetails 的东西,但无法弄清楚为什么我在回发时遇到问题。 (2认同)
  • 我也遇到了同样的情况,我的财产叫做“Usuario”。谢谢@adinas! (2认同)

Tra*_*er1 11

确保您的模型将其属性标记为属性(如果使用VB或带有get/set的C#),而不是公共字段...... MVC将不会映射到公共字段,而是映射到公共属性.


Eth*_*iac 6

有两种主要方式可以实现.

一种方法是你有自定义模型绑定不起作用.我假设你正在做所有开箱即用的事情,所以这不适用.

最可能的问题是数据没有获得POST.确保字段存在 Delete按钮POST的同一Form中.