C# ASPNET MVC-为什么ModelState.IsValid为false;“x”字段是必填的;该字段何时有值?
我有一个这样的模型:C# ASPNET MVC-为什么ModelState.IsValid为false;“x”字段是必填的;该字段何时有值?,c#,asp.net-mvc,asp.net-mvc-2-validation,C#,Asp.net Mvc,Asp.net Mvc 2 Validation,我有一个这样的模型: public PurchaseOrder { [Required] [StringLength(15)] public virtual string OrderNumber {get;set;} // etc. } 当我从视图中提交订单时(使用$.post,而不是input type=submit),它将转到我的控制器类: public class PurchaseOrderController { public Json
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
当我从视图中提交订单时(使用$.post,而不是input type=submit),它将转到我的控制器类:
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而不是提交吗?我能做什么
这是调试器的外观:
编辑:额外信息…
我真的认为由于某种原因,模型绑定没有发生。当我尝试在此处找到此代码时:)
然后ModelState.IsValid=true。compositeValidator.Validate()返回0个错误。我认为这表明模型没有绑定,但我仍然不知道为什么
控制器方法实际上是这样的(最初写这个问题时我漏掉了过滤器)
JsonFilter会这样做,从json提交的数据中提取POCO:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
我在这行上放置了一个断点,order是有效的,加上order.OrderNumber具有正确的值
所以仍然没有解决,但希望这些额外的信息有助于找到解决方案您确定错误来自OrderNumber字段吗 奇怪的是,错误消息中有两个单词的订单号
尝试更改字段的名称或删除所需的标记,以确保这是错误的来源。您的jQuery帖子可能没有以正确的方式发回控制器。您可能只是发布订单号,而不是准确表示模型的对象。我必须查看您的javascript才能绝对确定 发布到该方法的正确方法是(假设您的订单号存储在名为“orderNumber”的javascript变量中): 如果是这种情况,那么我将采取的下一步是再次检查javascript是否确实捕获了您订单号的值,并将其作为请求的一部分发布。通过Firebug进行快速检查应该能够告诉您是否发生了这种情况。我已经“解决”了这是我的梦想,但我真的不明白为什么我所做的改变会有所帮助 我必须做三件事:
为什么该属性标记为虚拟?您是否使用POCO更改跟踪?值是多少?您如何使用
$。post
?它是否与正常提交一起工作?我不知道为什么它是虚拟的,就像我开始使用现有应用程序时那样。是的,它与正常输入类型=提交按钮代码一起工作,用于手动验证模型的有效性und here:我相信MVC框架可以神奇地自动处理这些问题。这与使用Html.LabelFor(model.OrderNumber)时一样。标签上写着“OrderNumber”,单词之间有空格。如果我删除[Required]注释,然后是ModelState.IsValid==true。它也是此注释的唯一字段。看起来我需要将调用控制器方法的$.post()更改为$.ajax()。但感觉好像我做错了什么,如果contentType是application/x-www-form-urlencoded的默认值,它应该可以工作。
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
$.post([url to method],
{ order: { OrderNumber: orderNumber } },
function(json) {
//Insert code for actions to take after AJAX post returns.
},
'json');