Tôi có một mô hình như thế này:ASPNET MVC - Tại sao ModelState.IsValid sai "Trường x là bắt buộc" khi trường đó có giá trị?
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
Khi tôi gửi một đơn đặt từ màn hình (sử dụng $ .post, không input type = nộp) nó đi đến lớp điều khiển của tôi:
public class PurchaseOrderController
{
public JsonResult Save(PurchaseOrder order)
{
// TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway
if (ModelState.IsValid)
{
// its never valid
}
}
}
ModelState.IsValid luôn trả về false, với lỗi: "Trường Số thứ tự là bắt buộc". Nhưng có một giá trị trong trường này (?? lý do)
Tại sao giá trị "được yêu cầu" khi giá trị đó có giá trị? Tôi đã bỏ lỡ một cái gì đó? Có phải vì $ .post thay vì gửi không? Tôi có thể làm gì?
Đây là những gì debugger trông giống như:
alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png
EDIT: info tắm ....
Tôi thực sự nghĩ rằng đối với một số lý do mô hình ràng buộc không xảy ra. Khi tôi thử mã này được tìm thấy tại đây:)
if (!ModelState.IsValid)
{
ModelState.Clear();
ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType());
ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext);
foreach (ModelValidationResult result in compositeValidator.Validate(null))
{
this.ModelState.AddModelError(result.MemberName, result.Message);
}
}
Sau đó, ModelState.IsValid = true. Hàm compositeValidator.Validate() trả về 0 lỗi. Tôi nghĩ điều này cho thấy mô hình không bị ràng buộc, nhưng tôi vẫn không biết tại sao.
Phương pháp điều khiển thực sự trông như thế này (tôi bỏ lỡ các bộ lọc khi ban đầu viết câu hỏi này)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
Và JsonFilter thực hiện điều này để trích xuất các POCO từ json dữ liệu nộp:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
Tôi đặt điểm ngắt trên dòng này và thứ tự hợp lệ, cộng với đơn đặt hàng.OrderNumber có giá trị chính xác.
Vì vậy, vẫn chưa được giải quyết, nhưng hy vọng thông tin thêm này sẽ giúp việc tìm kiếm một giải pháp
tại sao thuộc tính được đánh dấu ảo? Bạn đang sử dụng theo dõi thay đổi POCO? –
Giá trị là gì? Bạn đang sử dụng '$ .post' như thế nào? Nó có hoạt động bình thường không? –
Tôi không biết tại sao nó là ảo, nó đã được như thế khi tôi bắt đầu làm việc trên các ứng dụng hiện có. –