我有一个这样的模型:
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
当我从视图中提交订单时(使用$ .post,而不是输入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而不是提交?我该怎么办?
这是调试器的样子:
alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png
编辑:额外信息....
我真的认为由于某种原因,模型绑定没有发生。当我尝试在此处找到此代码时:)
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错误。我认为这表明模型没有约束,但我仍然不知道为什么。
控制器方法实际上看起来像这样(我在最初写这个问题时错过了过滤器)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
JsonFilter这样做是为了从json提交的数据中提取POCO:
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
我在这一行放了一个断点,顺序有效,加上order.OrderNumber有正确的值。
所以仍未解决,但希望这些额外的信息有助于找到解决方案
答案 0 :(得分:1)
您确定错误来自OrderNumber字段吗?
奇怪的是,错误消息的订单号为2个字。
尝试更改字段名称或删除所需标记,以确保错误来自此处。
答案 1 :(得分:1)
您的jQuery帖子有可能没有以正确的方式发布回控制器。您可能只发布订单号而不是准确表示模型的对象。我必须看到你的javascript绝对肯定。
发布到该方法的正确方法是(假设您的订单号存储在名为“orderNumber”的javascript变量中:
$.post([url to method],
{ order: { OrderNumber: orderNumber } },
function(json) {
//Insert code for actions to take after AJAX post returns.
},
'json');
如果是这种情况,那么我要采取的下一步是仔细检查javascript是否确实捕获了订单号的值并将其作为请求的一部分发布。通过Firebug的快速检查应该能够告诉你这是否正在发生。
答案 2 :(得分:1)
我已经“解决”了它,但我真的不明白为什么我所做的改变有所帮助。
我必须做三件事:
删除json过滤器(过滤器不绑定)
将contentType更改为application / json
$。ajaxSetup({ contentType:“application / json; charset = utf-8” });
使用MVC期货下载Microsoft.Mvc.dll,如下所述:http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx。如何将其添加到Global.asax.cs中的Application_Start():
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
现在我不知道为什么会有效,但它有。
不幸的是,它有一个负面的副作用:contenttype应用于所有$ .get()和$ .post()方法,并打破了我所有的jqgrids - 它们似乎只在内容类型是默认值时才起作用应用程序/ x-WWW窗体-urlencoded
所以我问过2个问题:
是否可以在$ .post()调用中设置内容类型?然后我不需要全局设置它 Jquery - How to make $.post() use contentType=application/json?
如果contenttype是application / json,是否可以使jqrid工作? Jquery - How to make $.post() use contentType=application/json?