开发者

ASP.NET MVC UpdateModel - fields vs properties?

开发者 https://www.devze.com 2022-12-26 19:22 出处:网络
I refactored some common properties into a base class and immediately my model updates started failing. UpdateModel() and TryUpdateModel() did not seem to update inherited public properties.

I refactored some common properties into a base class and immediately my model updates started failing. UpdateModel() and TryUpdateModel() did not seem to update inherited public properties.

I cannot find detailed info on MSDN nor Google as to the rules or semantics of these methods. The docs are terse (http://msdn.microsoft.com/en-us/library/dd470933.aspx), simply stating:

Updates the specified model instance using values from the controller's current value provider.

SOLVED: MVC.NET does indeed handle inherited properties just fine. This turned out to have nothing to do with inheritance. My base class was implemented with public fields, not properties. Switching them to formal properties (adding {g开发者_运维问答et; set; }) was all I needed. This has bitten me before, I keep wanting to use simple, public fields. I would argue that fields and properties are syntactically identical, and could be argued to be semantically equivalent, for the user of the class.


MVC will bind to properties of the inherited class. The model binder calls something like typeof(yourtype).GetProperties() which returns all the inherited members just fine.

Just tested it out with:

public class PersonBase
{
    public string Name { get; set; }
}

public class User : PersonBase
{
    public string FavoriteFood { get; set; }
}

"My assumption is the methods are reflecting on the top class only,"

How would that work? The "top" class IS the base class too.


this one made me curious too. i made a edit form for a class Manager who derives from a Person (after all, managers are persons too :-))

then in this action method

 public ActionResult Edit(Manager manager )
        {
            return View(manager);
        }

which wass called from a view with the Manager (derived type) as strong typed Model variable, when hovering the manager variable, it shows me the base class (it actually said: base: Person ) AND the one extra property for the manager

tried the formcollection too, and that also works:

 public ActionResult Edit(FormCollection  formCollection )
        {
            Manager manager = new Manager();
            UpdateModel(manager );
            return View(manager);
        }
0

精彩评论

暂无评论...
验证码 换一张
取 消