Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC3 - Model empty on post

I have two models - category and article. I have pretty much the same delete views and controllers for both of them. The only difference is that it works for categories, but with articles I get empty model on HttpPost.

Categories:

    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");
    }

Articles:

    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");
    }

Both views are generated by Visual Studio and I haven't changed them. When I want to delete a category, everything goes well. But when I want to delete an article, it first gets selected properly from database, then the view is displayed (everything is OK) but when I click the delete button the model is empty (all properties are either 0, null or false) and so the db.DeleteArticle throws an exception (there's no article with ArticleID = 0). Could anyone please provide me with any hints as to what should I check or how should I work around this?

like image 942
jak Avatar asked Jun 01 '11 19:06

jak


2 Answers

If the parameter for the model in the [HttpPost] Action is the same name as a property in the model it'll be null and will fail validation saying the field was invalid.

Example:

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

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

sankdmfskm will be null.

Tested in MVC3 and MVC4.

like image 173
Bryan Wood Avatar answered Oct 14 '22 13:10

Bryan Wood


Had same problem. One of my properties in the model was called model

public String model { get; set; }

After renaming the property to myModel. The model object stopped coming back null in ActionResult

like image 31
adinas Avatar answered Oct 14 '22 13:10

adinas