Asp.net mvc TryUpdateModel与强类型方法参数

Asp.net mvc TryUpdateModel与强类型方法参数,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,在MVC2中,我过去创建强类型视图的方式与我发布时从未使用FormCollection对象的方式相同。我的签名总是这样: [AcceptVerbs(HttpVers.Post)] public Create(Person newPerson) { //code to update the person from the post } 但现在我看到了一种新的TryUpdateModel方式,我会写一些类似的东西: [AcceptVerbs(HttpVers.Post)] p

在MVC2中,我过去创建强类型视图的方式与我发布时从未使用FormCollection对象的方式相同。我的签名总是这样:

[AcceptVerbs(HttpVers.Post)] 
public Create(Person newPerson)
{ 
//code to update the person from the post
}
但现在我看到了一种新的TryUpdateModel方式,我会写一些类似的东西:

    [AcceptVerbs(HttpVers.Post)] 
    public Create()
    { 
        Person thePersonToCreate = new Person()
        TryUpdateModel(thePersonToCreate)
        {
            //Code to create the person if model is valid
        }    
    }

所以现在看来我必须模拟HTTPContext来测试这个方法。然而,似乎我仍然可以使用前一种方法使用强类型方法。我意识到TryUpdateModel方法对于那些使用FormCollection方法做事的人来说是一种改进,但是为什么还要麻烦TryUpdateModel呢?

有些情况下这是可取的。一个很好的例子是当您的模型需要更复杂的初始化或工厂方法来创建时

[AcceptVerbs(HttpVers.Post)] 
public Create()
{ 
    var dataAccess = new MyDataAccess("Another Param");
    Person thePersonToCreate = new Person(dataAccess);

    TryUpdateModel(thePersonToCreate)
    {
        //Code to create the person if model is valid
    }    
}
现在有人可能会说,定制ModelBinder在这里是一个更好的解决方案,但如果这是一次性的情况,那么这可能需要付出更多的努力。此外,在ModelBinder中隐藏此细节会使错误更难调试


我肯定还有其他情况,但这只是一个简单的例子。

当您必须首先将信息加载到实体中并合并值以进行验证时,有些人也会使用该方法。不过,在这些情况下,您可以只使用automapper,但有些公司禁止使用开源代码

我认为几乎没有人在一个架构良好的应用程序中使用FormCollection