Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
Silverlight应用程序的服务器端验证_Silverlight_Validation_Asynchronous_Server Side - Fatal编程技术网

Silverlight应用程序的服务器端验证

Silverlight应用程序的服务器端验证,silverlight,validation,asynchronous,server-side,Silverlight,Validation,Asynchronous,Server Side,我正要实现IDataErrorInfo,这时我看到INotifyDataErrorInfo将用于异步验证。当进一步挖掘时,我注意到使用这些接口的示例都在ViewModel上。我需要对模型进行验证,并且需要与模型一起存储的错误进行持久化。我有一个包含许多实体的大型图。此图需要传回服务器进行复杂的验证。我不确定我现在应该用什么方法 我是否只是将我的Interface实现移动到模型中 我看到的另一个例子有一个单独的验证服务。在我的例子中,我的验证规则很复杂,我正在考虑使用Windows工作流及其规则引

我正要实现IDataErrorInfo,这时我看到INotifyDataErrorInfo将用于异步验证。当进一步挖掘时,我注意到使用这些接口的示例都在ViewModel上。我需要对模型进行验证,并且需要与模型一起存储的错误进行持久化。我有一个包含许多实体的大型图。此图需要传回服务器进行复杂的验证。我不确定我现在应该用什么方法

我是否只是将我的Interface实现移动到模型中

我看到的另一个例子有一个单独的验证服务。在我的例子中,我的验证规则很复杂,我正在考虑使用Windows工作流及其规则引擎来提高验证规则的可维护性

我需要单独的验证服务吗

验证完成后,必须将图形传回客户端。然后需要显示任何错误/警告

我是否应该在模型中实现INotifyDataErrors,并在验证返回到客户端时引发事件,以将错误发布到视图中(通过ViewModel)


事实证明,我在引用类库中包含INotifyDataErrors的程序集时遇到问题。它会在共享这些类的程序集中产生冲突。

当您有大型项目时,RIA可能不是一个好主意,例如具有不同层(服务、应用程序、域、基础结构)的应用程序

不久前,我不得不用复杂的规则在Silverlight应用程序中实现验证。我使用的是实体框架生成的自跟踪实体。我需要重新使用所有的验证代码

首先,我尝试使用EntLib验证块,并在客户端和服务器上使用相同的代码。由于SL和.NET4.0使用不同版本的DataAnnotations程序集,因此这种方法不起作用,因为您会遇到一些问题

最后,我在服务器上编写了某种验证服务,返回实体的错误(如果有)。大概是这样的:

interface IValidate
{
    IEnumerable<string> Validate(Entity entity); 
}
class SomeViewModel : INotifyDataErrorInfo
{
    public User Entity { get; set; }

    public string Name { get { return Entity.UserName; } set {...} }        
    public string Email { get { return Entity.Person.Email; } set {...} }

    {...}
}
这样,所有验证逻辑都位于服务器上,并且可以随时更改,而不会影响客户端,因为所有实体在添加到数据库(如果使用数据库)之前都会通过此服务

该服务还可以返回错误以及与错误关联的属性,这样您就可以获得与Silverlight更丰富的交互。因此,服务可以是:

interface IValidate
{
    IEnumerable<PropertyError> Validate(Entity entity); 
}

class PropertyError
{
    public string PropertyName { get; }
    public IEnumerable<string> Errors { get; }
}
通过这种方式,可以将控件绑定到ViewModels属性而不是entities属性,但是使用更改通知会有点困难

您可能还需要检查:toolkit。它解决了为实体定义wapper的问题,并使用
DynamicObject
模拟一个对象,该对象具有包装对象的所有属性。这在处理大量数据时有点慢,但会大大简化工作


希望这能有所帮助。

Silverlight的全部目的是提供一个富客户端。这通常意味着客户机上的第一级验证(除了服务器上的任何验证)。RIA服务允许共享自定义验证器(在客户端和服务器上运行),但您的数据模型可能太复杂,无法使用RIA。@HiTech Magic,RIA肯定过时了。我已经有了一个类库和一个共享类的Silverlight类库。我使用支持Silverlight的WCF服务将数据从服务器发送到客户端。我确实有一些客户端验证,但这还不够。图形必须返回到服务器进行完全验证。如果验证代码可用于客户端和服务器,则可以使用RIA services项目的.shared.cs功能保存跨项目的链接文件。没有太多帮助,但比添加链接更简洁。有些验证可以由客户端和服务器共享,有些则不能。我只做添加链接,而不是将项目切换到RIA。您的viewmodels是通过服务器上的服务公开的吗?您在实现INotifyDataErrorInfo服务器端时没有遇到问题吗?是的。不,INotifyDataErrorInfo仅在客户端上实现。该服务只验证实体并返回错误。那么您这样说是什么意思:“然后在服务器上,我让视图模型实现INotifyDataErrorInfo”@Josh我已经对自己做了更多解释,请检查解决方案。我明白了,但我还有最后一个问题。在您的场景中,看起来您逐个验证了每个viewmodel。在我的场景中,我有一个viewmodel,其中包含数十到数百个模型对象,每个对象可能需要单独的验证。当我将实体传递回服务器进行验证时,实际上我传递的是一棵树(实体和所有子项)。我不认为我应该逐个传递每个实体,我需要一种方法来按实体包含错误。
class SomeViewModel : INotifyDataErrorInfo
{
    public User Entity { get; set; }

    public string Name { get { return Entity.UserName; } set {...} }        
    public string Email { get { return Entity.Person.Email; } set {...} }

    {...}
}