TryValidateModel是否针对同一个模型实例工作

时间:2013-12-17 18:02:13

标签: asp.net-mvc asp.net-mvc-4 razor-2

因此,我的数据可以在我的应用程序之外(在遗留系统中)。因此,当在GET上渲染模型时,我执行TryValidateModel以确保自上次存储以来没有任何更改会导致我的模型变为“坏”。

我的模型有一个特定的扩展属性/对象图(例如ModelInstance.Addresses.Generator.Address)。它似乎在我的Action方法的第一行(下面)加载得很好。如果我把 Debug.WriteLine 语句,例如在ModelState.Clear之前和之后,或者在TryValidateModel之前和之后,他们成功地测试并检测了我的模型的这部分..它不是null。并且实际的View剃刀执行并成功地向客户端表达关联的HTML标记 - 页面看起来正确,并且“地址”显示它应该在哪里。

但是,在TryValidateModel调用期间...验证逻辑,检查以确保'Address'属性不为null ...它失败。再次,在TryValidteModel调用之前和之后,您可以将光标放在intelliense / breakpoint中并查看有问题的属性..它存在..

如果我在我正在使用的IValidatableObject方法中放置一个断点,那么该属性是神奇的null,因此验证失败。

Function Edit(ByVal id As Integer) As ActionResult
    'load from WCF or from web cache
    Me.modelInstance.LoadFromCacheOrService(id)

    'breakpoint here / intellisense / add-watch shows valid model
    'for Me.modelInstance.Addresses.Generator.Address

    ModelState.Clear()

    'breakpoint here / intellisense / add-watch shows valid model
    'for Me.modelInstance.Addresses.Generator.Address

    'but, inside the tryvalidate .. it says the model is invalid 
    '(and F11 stepping into validation logic indeed it seems to be invalid)
    Me.TryValidateModel(Me.modelInstance)
    If Not ModelState.IsValid Then
        ViewBag.Info = String.Format("Looks like there's a few things you ought to fix and re-save for this order")
    End If

    'but the view renders correctly.. the 'address' property is indeed 'there'
    'and investigating the model in Visual Studio debugger shows the property is not null
    Return View("Edit", modelInstance)

End Function

我已经仔细检查了我的模型属性getter / setter,以确保我没有隐藏一些我忘记的魔法逻辑。我已经三次检查以确保我正在加载的实例与我传递给TryValidateModel的实例相同...但是我很沮丧,因此我在这里写了这个扩展问题,希望其他人遇到过这个问题。


我认为下一步是获取MVC源代码的副本,逐步浏览整个堆栈并找出可能与我的模型交互的其他内容。这真的感觉我正在处理2个单独的对象图。

1 个答案:

答案 0 :(得分:0)

确定。我终于弄明白了。实际上,调用了相同类型的单独模型实例。这一切现在都有意义......

我注意到无效的ModelState的错误集合与另一个我没有立即回忆起的对象图有关...(接下来发生了很多事情)......

然后,我终于回想起我的'Order'对象有一个新添加的属性,允许它交叉引用另一个Order ..我们将调用我添加的新属性“CrossReferenceOrder”,它与我的类型相同main“Order”对象..这意味着它还实现了IValidatableObject -

一旦我发现属性绑定/验证触发了主对象图的“叶子”被实例化和验证,我就能够很快地解决问题。