【问题标题】:Server side validation in asp.net MVC 3 with entity framework带有实体框架的 asp.net MVC 3 中的服务器端验证
【发布时间】:2011-10-19 09:35:35
【问题描述】:

我正在使用带有 Enitity 框架字的 asp.net MVC3。两者都通过 WCF Web 服务进行通信。

问题在于,在服务器端,数据库开发人员不想将 [Required]/[Range] 属性设置为实体类中的属性。但我想在 mvc3 应用程序中验证我最后的字段。我在哪里添加了 WCF Web 服务参考。生成代理。

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

忘记添加:数据库开发人员严格避免用户需要。也没有在实体和映射中生成 db。

【问题讨论】:

    标签: asp.net-mvc-3 validation entity-framework-4 required


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我同意 Ladislav 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

      【讨论】:

      • 好的,我可以使用部分类将属性添加到代理中对象的现有属性。这样可以吗?
      • 我不确定您的代理,但您可以使用属性[MetadataType(typeof(YourOwnClassForValidation))] 来定义一个类,其中验证属性设置为属性。如果您有一个自动生成的实体类,该实体类将在您下次使用设计器作为示例时发生变化,这将非常有用。
      【解决方案3】:

      您可以注册一个类以用作模型的元数据/验证提供程序。

      拥有你的实体,这是无法改变的:

      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; }
      }
      

      最后,您只需将 Metadata/Validator 类附加到对应的基类,例如在 Global.asax 上:

      protected void Application_Start()
      {
          AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;
      
          typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
                  typeof(MyModel),
                  typeof(MyModelValidator));
      
          TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel));
      
          // register other metadata classes
      }
      

      您可以为每个想要的实体执行此操作。

      【讨论】:

        【解决方案4】:

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

        将验证属性放在您的视图模型中,并使用映射器(如自动映射器)将信息复制到数据库实体/从数据库实体复制信息。

        在控制器操作中使用ModelState.IsValid 来检查视图模型是否有效。

        我的 POST 操作方法通常看起来有点像这样:

        [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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 1970-01-01
          • 2012-05-30
          • 2011-07-21
          • 2013-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多