Tôi đã có một ViewModel có một số xác thực DataAnnotations và sau đó để xác thực phức tạp hơn triển khai IValidatableObject và sử dụng phương thức Validate.IValidatableObject Xác thực phương pháp kích hoạt khi DataAnnotations không thành công
Hành vi tôi mong đợi là this one: trước hết là DataAnnotations và sau đó, chỉ khi không có lỗi, phương thức Xác thực. Làm cách nào tôi biết được điều này không phải lúc nào cũng đúng. My ViewModel (một bản trình diễn) có ba tệp được nộp string
, một decimal
và một decimal?
. Tất cả ba thuộc tính đều chỉ có thuộc tính Bắt buộc. Đối với string
và decimal?
hành vi là hành vi mong đợi, nhưng đối với decimal
, khi trống, Xác thực bắt buộc không thành công (cho đến nay rất tốt) và sau đó thực thi phương thức Xác thực. Nếu tôi kiểm tra tài sản, giá trị của nó bằng không.
Điều gì đang xảy ra ở đây? Tôi đang thiếu gì?
Lưu ý: Tôi biết rằng Thuộc tính bắt buộc giả sử để kiểm tra xem giá trị có rỗng không. Vì vậy, tôi hy vọng sẽ được yêu cầu không sử dụng thuộc tính Bắt buộc trong các loại không thể null (vì nó sẽ không bao giờ kích hoạt), hoặc, bằng cách nào đó thuộc tính hiểu các giá trị POST và lưu ý rằng trường không được lấp đầy. Trong trường hợp đầu tiên, thuộc tính sẽ không kích hoạt và phương thức Validate sẽ kích hoạt. Trong trường hợp thứ hai, thuộc tính sẽ kích hoạt và phương thức Validate sẽ không kích hoạt. Nhưng kết quả của tôi là: các thuộc tính gây nên và phương thức Validate kích hoạt.
Đây là mã (không có gì quá đặc biệt):
Bộ điều khiển:
public ActionResult Index()
{
return View(HomeModel.LoadHome());
}
[HttpPost]
public ActionResult Index(HomeViewModel viewModel)
{
try
{
if (ModelState.IsValid)
{
HomeModel.ProcessHome(viewModel);
return RedirectToAction("Index", "Result");
}
}
catch (ApplicationException ex)
{
ModelState.AddModelError(string.Empty, ex.Message);
}
catch (Exception ex)
{
ModelState.AddModelError(string.Empty, "Internal error.");
}
return View(viewModel);
}
mẫu:
public static HomeViewModel LoadHome()
{
HomeViewModel viewModel = new HomeViewModel();
viewModel.String = string.Empty;
return viewModel;
}
public static void ProcessHome(HomeViewModel viewModel)
{
// Not relevant code
}
ViewModel:
public class HomeViewModel : IValidatableObject
{
[Required(ErrorMessage = "Required {0}")]
[Display(Name = "string")]
public string String { get; set; }
[Required(ErrorMessage = "Required {0}")]
[Display(Name = "decimal")]
public decimal Decimal { get; set; }
[Required(ErrorMessage = "Required {0}")]
[Display(Name = "decimal?")]
public decimal? DecimalNullable { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
yield return new ValidationResult("Error from Validate method");
}
}
Xem:
012.@model MVCTest1.ViewModels.HomeViewModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm(null, null, FormMethod.Post))
{
<div>
@Html.ValidationSummary()
</div>
<label id="lblNombre" for="Nombre">Nombre:</label>
@Html.TextBoxFor(m => m.Nombre)
<label id="lblDecimal" for="Decimal">Decimal:</label>
@Html.TextBoxFor(m => m.Decimal)
<label id="lblDecimalNullable" for="DecimalNullable">Decimal?:</label>
@Html.TextBoxFor(m => m.DecimalNullable)
<button type="submit" id="aceptar">Aceptar</button>
<button type="submit" id="superAceptar">SuperAceptar</button>
@Html.HiddenFor(m => m.Accion)
}
'thập phân' sẽ không bao giờ là rỗng. Nó không phải là nullable như 'string' hoặc' decimal? '. Hành vi bạn mong đợi là gì? – Joao
@Jota Tôi cho rằng thuộc tính Bắt buộc sẽ không hoạt động vì 'thập phân' sẽ không bao giờ là null hoặc Phương thức xác thực không được gọi vì một số xác thực DataAnnotation không thành công. – Diego
Bạn đã đặt 'decimal' thành nullable nếu không [Bắt buộc] sẽ không bao giờ kích hoạt. Có lý do nào để không làm điều đó không? – Joao