2

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

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

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

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

4

4 回答 4

2

您必须编写代码来验证您的实体。即使开发人员在实体上使用了这些属性,您也不会拥有它们,因为您正在通过 WCF 生成的代理访问 DAL,并且这些属性不是由您身边的工具生成的。

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

于 2011-10-19T09:44:52.263 回答
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

于 2011-10-19T10:05:54.583 回答
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; }
}

最后,您只需要将 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
}

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

于 2011-10-19T10:52:30.017 回答
1

使用视图模型。他们的预期目的之一是从视图中抽象出模型(如 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-10-19T13:20:37.653 回答