Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASPNET MVC - Why is ModelState.IsValid false "The x field is required" when that field does have a value?

I have a model like this:

public PurchaseOrder 
{
    [Required] [StringLength(15)]
    public virtual string OrderNumber {get;set;}
    // etc.        
}

When I submit an order from the view (using $.post, not input type=submit) it goes to my controller class:

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 always returns false, with the error: "The Order Number field is required." But there is a value in this field (?? why)

Why would it say "value is required" when it does have a value? Have I missed something? Is it because of the $.post instead of the submit? What can I do?

This is what the debugger looks like:

alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png

EDIT: Extra info....

I really think that for some reason the model binding is not happening. When I try this code found here: )

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);
    }
}

Then ModelState.IsValid = true. compositeValidator.Validate() returns 0 errors. I think this indicates the model was not bound, but I still don't know why.

The controller method actually looks like this (I missed out the filter when originally writing this question)

[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))] 
public JsonResult Save(PurchaseOrder order) { //  etc ... }

And the JsonFilter does this to extract the POCO from the json submitted data:

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType);

I put a breakpoint on this line, and order is valid, plus order.OrderNumber has the correct value.

So still unresolved, but hopefully this extra info will help with finding a solution

like image 934
JK. Avatar asked May 08 '10 01:05

JK.


1 Answers

Are you sure that the error is coming from the OrderNumber field?

It seems strange that the error message has Order Number in 2 words.

Try changing the name of the field or removing the required tag to make sure that this is where the error is coming from.

like image 155
Shiraz Bhaiji Avatar answered Oct 03 '22 06:10

Shiraz Bhaiji