2011-10-19 42 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); 
    } 
}