【问题标题】:MVC3 - Model empty on postMVC3 - 模型在帖子上为空
【发布时间】:2011-06-01 19:00:22
【问题描述】:

我有两个模型 - 类别和文章。我对它们都有几乎相同的删除视图和控制器。唯一的区别是它适用于类别,但对于文章,我在 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 的文章)。任何人都可以向我提供有关我应该检查什么或应该如何解决这个问题的任何提示吗?

【问题讨论】:

  • 您的文章类是什么样的?
  • 是的,就像@SLaks 所说,您可以向您的 HttpPost 删除操作添加一个参数,例如 FormCollection coll。发布后,您可以检查集合以查看随表单发布的所有键/值。
  • 看看函数调用db.ArticleByID(id) - 它返回一个有效的对象吗?

标签: c# asp.net-mvc-3 razor


【解决方案1】:

如果[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 中测试。

【讨论】:

    【解决方案2】:

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

    public String model { get; set; }
    

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

    【讨论】:

    • 这真的是随机的!我不敢相信存在这样的错误,而且还没有解决!
    • 我的参数被称为名称,并导致了同样的问题。谢谢!
    • 很好的答案!这里有类似的问题,因为我无法让它工作而把我的头发拉出来。您的回答使我朝着正确的方向前进。我使用的是 public ShippingDetails ShippingDetails 之类的东西,但无法弄清楚为什么我在回发时遇到问题。
    • 很高兴我能帮上忙 :-)
    • 同样的事情发生在我身上,我的财产被称为“Usuario”。谢谢@adinas!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      发生这种情况的主要方式有两种。

      一种方法是您的自定义模型绑定不起作用。我假设您所做的一切都是开箱即用的,所以这不适用。

      最可能的问题是未发布数据。确保字段存在删除按钮正在发布的同一个表单中。

      【讨论】:

        【解决方案5】:

        我和你有同样的问题。我在你的情况下做了

        [HttpPost]
        public ActionResult Index(ContactMessage sankdmfskm)
        {
        UpdateModel(sankdmfskm);
        ...
        }
        

        模型更新后,它返回了正确的值,不再为空。

        【讨论】:

          【解决方案6】:

          我正在添加一个答案,因为它与其他人不同,有人可能会觉得它很有用。

          我有一个 BaseViewModel,因为我在一个视图中使用多个模型。

          在我的控制器操作上,我没有传递 BaseViewModel(以及 model.RegistrationModel.Username 等参数),而是传递了 RegistrationFormModel,因此它没有绑定到我在视图中使用的 BaseViewModel

          查看 img - 我遇到的问题是我将 RegistrationModel 传递给 Post 操作,而不是 View 中使用的 BaseAuthenticationModel(它包含 RegistrationModel)。所以绑定没有正确发生

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-23
            • 2021-09-03
            相关资源
            最近更新 更多