TryUpdateModel与强类型方法参数

时间:2011-10-03 19:10:10

标签: 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)] 
    public Create()
    { 
        Person thePersonToCreate = new Person()
        TryUpdateModel(thePersonToCreate)
        {
            //Code to create the person if model is valid
        }    
    }

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

2 个答案:

答案 0 :(得分:2)

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

[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中会使错误更难调试。

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

答案 1 :(得分:2)

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

我认为几乎没有人在设计良好的应用程序中使用FormCollection。