我有这样一个模型:
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
当我从 View 提交订单时(使用 $.post,而不是输入 type=submit)它转到我的 Controller 类:
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 始终返回 false,并显示错误:“需要订单号字段。”但是这个字段是有值的(??为什么)
当它确实有值时,为什么会说“需要值”?我错过了什么吗?是因为 $.post 而不是提交吗?我能做什么?
这是调试器的样子:
alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png
编辑:额外信息....
我真的认为由于某种原因模型绑定(bind)没有发生。当我尝试在此处找到此代码时:)
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);
}
}
然后 ModelState.IsValid = true。 compositeValidator.Validate() 返回 0 个错误。我认为这表明模型未绑定(bind),但我仍然不知道为什么。
Controller 方法实际上是这样的(我在最初写这个问题时漏掉了过滤器)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
JsonFilter 这样做是为了从提交的 json 数据中提取 POCO:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
我在这一行下了断点,order是有效的,加上order.OrderNumber的值是正确的。
所以仍然没有解决,但希望这些额外的信息能帮助找到解决方案
最佳答案
您确定错误来自 OrderNumber 字段吗?
奇怪的是,错误消息中有 2 个单词的订单号。
尝试更改字段的名称或删除所需的标记以确保这是错误的来源。
关于c# - ASPNET MVC - 为什么 ModelState.IsValid false "The x field is required"当该字段确实有值时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792603/