我使用共享库中的一些类作为模型类。这就是为什么我无法改变它(添加一些属性或其他任何东西)。但我需要在我的页面上添加验证,我将该类用作@model。 当然我可以通过js验证模型,但我想知道是否有任何方法可以通过标准的microsoft mvc方法在Razor视图中添加验证规则? 我的意思是那样的
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => (THERE IS MY VALIDATION EXPRESSION), "*", new { @class = "text-danger" })
答案 0 :(得分:2)
开箱即用ASP.NET MVC不提供在Razor中验证模型的功能。不幸的是,这是使用属性进行模型验证的问题之一。
从这里,您有两种选择:
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
然后验证您的模型:
var validator = new YourModelValidator();
ValidationResult results = validator.Validate(yourModel);
就个人而言,我会选择第二种方法。 Fluent Validation是一个非常棒的库,不需要很长时间才能实现,并且是一种比ASP.NET当前实现更好的验证模型的方法(在我看来 - 虽然这没有任何遗漏) ASP.NET人员,这就是OSS的伟大之处。)
答案 1 :(得分:0)
您无法在Razor中执行此操作,但如果您的共享库类是部分的,则可以执行此操作
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(EmployeeSharedValidation))]
public partial class EmployeeShared
{
private class EmployeeSharedValidation
{
[Required]
public string Name;
}
}
这是验证属性如何应用于EntityFramework类,几年前它们基本上是共享类,它不被视为一种好的做法。 正如其中一条评论中提到的那样,您应该使用视图模型,因为该字段将始终对其使用的任何页面进行此验证。 E.g上面代码中的名称字段对于使用EmployeeShared类的任何页面都是必需的,您无法轻易更改它。