2011-10-19 43 views
2

我在使用Enitity frameword使用asp.net MVC3。两者都通过WCF网络服务进行通信。在实体框架中使用asp.net MVC 3进行服务器端验证

的问题是,在服务器端数据库开发商不希望设置[必须]/[范围]在有实体类属性属性。但我想在mvc3应用程序的末尾验证该字段。在那里我添加了WCF web服务引用。其中生成代理。

我不想根据客户端策略使用Jquery/javascript。所以我需要在我的控制器/模型级别执行此操作。如何管理这个?一些如何我需要从mvc 3 aaplication动态添加必需的属性到每个实体的属性。需要正确的方向加快。

忘记添加:Db开发人员严格规避用户需求。也没有在实体和映射中生成db。

回答

2

您必须write a code to validate your entities。即使开发人员在实体上使用这些属性,也不会让他们站在您的身边,因为您通过WCF生成的代理访问DAL,并且这些属性不是由您身边的工具生成的。

通过添加服务引用生成的所有类应该是局部的,因此您可以添加自定义的一部分的区域,实施验证(通过实现IValidatableObject接口)。

2

我同意拉吉斯拉夫Mrnka,但如果你不能改变的实体类的属性,你必须源出来:

[MetadataType(typeof(YourOwnClassForValidation))] 
public partial class ClassOfYourDbDeveloper 
{ 
    // db developer doesn't allow you to change this 
    public string Title { get; set; } 
} 

public class YourOwnClassForValidation 
{ 
    // here you can use your data annotations 
    // important to use object 
    [Required] 
    public object Title { get; set; } 
} 

它只是设置属性,阅读更多有关在这里底部:http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

+0

好了,所以我可以通过使用部分类属性添加到代理对象的现有属性。会允许我吗? –

+0

我不确定您的代理服务器,但您可以使用属性'[MetadataType(typeof(YourOwnClassForValidation))]'定义一个类,其中将验证属性设置为属性。如果你有一个自动生成的实体类,这将有助于你下次以设计师身份进行更改。 – Marc

1

您可以注册要作为你的模型元/验证提供商类。

有你的实体,这是不能被改变:

public class MyModel 
{ 
    public int IntProperty { get; set; } 

    public DateTime DateProperty { get; set; } 
} 

你可以有它的MVC侧的元数据,你可以验证并提供元数据,就好像它是原班:

[ValidationAttribute(...)] 
[ValidationAttribute(...)] 
public class MyModelValidator 
{ 
    [Required] 
    [Display("My Integer")] 
    public int IntProperty { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime DateProperty { get; set; } 
} 

最后,您只需将元数据/验证程序类附加到通讯组基础类,例如Global.asax上:

protected void Application_Start() 
{ 
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider; 

    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
      typeof(MyModel), 
      typeof(MyModelValidator)); 

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel)); 

    // register other metadata classes 
} 

你可以为你想要的每个实体做这件事。

1

使用视图模型。他们的预期目的之一是从视图中抽象出模型(如MVC中的M)对象。

认沽验证您的视图模型属性和使用映射器(如automapper)信息从数据库实体复制到/。

使用ModelState.IsValid在你的控制器动作,以检查是否视图模型是有效的。

我POST操作方法通常看起来成才liek这样的:

[HttpPost] 
public virtual ActionResult Edit(EditModel model) 
{ 
    if (!ModelState.IsValid) 
     return View(model); 

    try 
    { 
     // fetch db entity 
     var template = _templateService.Get(model.Id); 

     // copy info from view model to db entity 
     Mapper.Map(model, template); 

     // save db entity 
     templateService.Save(template); 

     return RedirectToAction("Details", new { id = template.Id }); 
    } 
    catch (Exception err) 
    { 
     Logger.Error("Failed to save template", err); 
     ModelState.AddModelError("", err); 
     return View(model); 
    } 
}