Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc TryValidateModel对同一个模型实例有效吗_Asp.net Mvc_Asp.net Mvc 4_Razor 2 - Fatal编程技术网

Asp.net mvc TryValidateModel对同一个模型实例有效吗

Asp.net mvc TryValidateModel对同一个模型实例有效吗,asp.net-mvc,asp.net-mvc-4,razor-2,Asp.net Mvc,Asp.net Mvc 4,Razor 2,因此,我的数据可以在我的应用程序之外的遗留系统中进行标记。因此,当在GET上渲染模型时,我会执行TryValidateModel以确保自上次存储以来没有任何会导致模型变为“坏”的更改 我的模型有一个特定的扩展属性/对象图,例如ModelInstance.Addresses.Generator.Address。在下面我的操作方法的第一行中,它似乎加载得很好。如果我将Debug.WriteLine语句放在ModelState.Clear之前和之后。。或者在TryValidateModel之前和之后,

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

我的模型有一个特定的扩展属性/对象图,例如ModelInstance.Addresses.Generator.Address。在下面我的操作方法的第一行中,它似乎加载得很好。如果我将Debug.WriteLine语句放在ModelState.Clear之前和之后。。或者在TryValidateModel之前和之后,他们成功地测试和检测了我的模型的这一部分。。它不是空的。实际视图razor执行并成功地向客户机表达了相关的HTML标记——页面看起来正确,“地址”显示在它应该显示的位置

但是,在TryValidateModel调用期间。。检查以确保“Address”属性不为空的验证逻辑片段。。。它失败了。同样,在TryValidteModel调用之前和之后,您可以将光标放在IntelliSense/断点中,并查看相关属性。。它是存在的

如果我在正在使用的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源代码的副本,逐步遍历整个堆栈,并找出可能与我的模型交互的其他内容。感觉就像我在处理两个独立的对象图。

好的。我终于明白了。实际上,有一个相同类型的单独模型实例正在被调用。现在一切都有意义了

我注意到无效ModelState的错误集合与另一个我没有立即回忆起来的对象图有关。。。接踵而至的是许多令人挠头的事情

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

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