MVC Controller Actions和ModelState.IsValid会发生什么

时间:2012-09-26 14:41:19

标签: asp.net-mvc

控制器方法调用期间会发生什么?对于控制器中的每个PUBLIC方法,MVC是否评估/设置ModelState?它是否在方法参数中测试每个类??

public ActionResult Create(Entity myEntity, AnotherEntity, myEntity2)
{
    if (ModelState.IsValid)
    {

如果我返回int而不是ActionResult:

public int Create(Entity myEntity, AnotherEntity, myEntity2)
{
    if (ModelState.IsValid)
    {

是否仍有一个带有评估类的ModelState?

1 个答案:

答案 0 :(得分:3)

实际上它不是控制器。这是模型绑定器。模型绑定器的职责是在给定请求值的情况下实例化相应的模型。所以第一步是模型绑定,第二步是验证。第一步由模型绑定器完成。如果在此步骤中出现错误(例如,您尝试将模型上的整数字段绑定到用户输入某些任意文本的输入文本),模型绑定器会自动向模型状态添加错误,因此一旦您输入控制器操作,您可以测试ModelState.IsValid

如果模型绑定成功,那么您将拥有一个现在传递给相应验证框架的模型实例。因此,例如,如果您正在使用数据注释并使用验证属性修饰模型属性,那么将对它们进行评估,如果存在错误,它们将再次自动添加到ModelState中。

  

如果我返回int而不是ActionResult:

您将违反ASP.NET MVC中的标准约定,其中所有控制器操作都必须返回ActionResult。但是返回类型实际上与输入参数和验证的模型绑定无关。返回类型可以是ActionResult的任何可能派生类或自定义类。

因此,例如,如果要渲染模型的HTML表示形式,则返回ViewResult。如果要返回模型的JSON表示,请返回JsonResult。如果要返回一些静态字符串,则返回ContentResult。如果您想允许用户下载文件,请返回FileResult。等等。