8
votes

Aspnet mvc - pourquoi est-ce que ModelState.isvalid false "Le champ X est requis" lorsque ce champ a une valeur?

J'ai un modèle comme celui-ci:

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


5 commentaires

Pourquoi la propriété est-elle marquée virtuelle? Utilisez-vous un suivi de changement de POCO?


Quelle est la valeur? Comment utilisez-vous $. Post ? Fonctionne-t-il avec une soumission normale?


Je ne sais pas pourquoi c'est virtuel, c'était comme ça quand j'ai commencé à travailler sur l'application existante.


Oui, cela fonctionne avec un type d'entrée normal = bouton Soumettre


Le code pour la validation manuelle du modèle a été trouvé ici: DIGITALLYLYCAREED.net/blog/54/...


3 Réponses :


1
votes

Êtes-vous sûr que l'erreur provient du champ de commande de commande?

Il semble étrange que le message d'erreur ait le numéro de commande en 2 mots.

Essayez de changer le nom du champ ou de supprimer la balise requise pour vous assurer que c'est là que l'erreur provient.


2 commentaires

Je crois que le framework MVC gère cela pour vous par magie. C'est le même que lorsque vous allez html.labelfor (modèle.ordernumber). L'étiquette indique "numéro de commande" avec un espace entre les mots.


Si je supprimais l'annotation [requise], puis modelstate.isvalid == true. C'est aussi le seul champ avec cette annotation.



1
votes

Il y a une chance que votre message JQuery ne pose pas de la bonne manière du contrôleur. Vous pouvez afficher uniquement le numéro de commande plutôt qu'un objet qui représente avec précision le modèle. Je devrais voir votre JavaScript pour être absolument certain.

La bonne façon de poster à cette méthode serait (en supposant que votre numéro de commande soit stocké dans une variable JavaScript appelée "Numéro de commande": p>

$.post([url to method], 
       { order: { OrderNumber: orderNumber } }, 
       function(json) {
       //Insert code for actions to take after AJAX post returns.
       },
       'json');


0 commentaires

1
votes

Eh bien, j'ai "résolu" cela, mais je ne comprends pas vraiment pourquoi les changements que j'ai faits ont aidé.

Je devais faire trois choses:

  1. Retirez le filtre JSON (les filtres ne lient pas)

  2. changer le contenu de l'adresse en application / json

    $. AjaxSetUp ({ contenttype: "Application / JSON; CHRSTE = UTF-8" });

  3. Utilisez le MVC Futures Télécharger Microsoft.MVC.dll comme décrit ici: http://haacked.com/archive/2010/04/15/sending-json-a-an-asp-net-mvc- action-méthode-argument.aspx . Où est dit d'ajouter ceci à application_start () dans global.asax.cs:

    ValueProviderFactories.Factories.Ajouter (Nouveau JsonvalueProviderFactory ());

    Maintenant, je ne sais pas exactement pourquoi cela a fonctionné, mais il a.

    Malheureusement, il a eu un effet secondaire négatif: le contenu de contenu est appliqué à toutes les méthodes $ () et $ .post .post () et de tous mes jqgrids - ils ne semblent ne pas fonctionner si le type de contenu est la valeur par défaut de Application / X-www-Form-Urlencodé

    J'ai donc demandé 2 suivi sur les questions:

    1. est-il possible de définir le type de contenu dans un appel de $ .post ()? Ensuite, je n'aurais pas besoin de la définir globalement Comment créer $ .post () Utilisez contentType = Application / Json ?

    2. est-il possible de faire des travaux JQRID si le contenuType est Application / JSON? Comment créer $ .post () Utilisez contentType = Application / Json ?


1 commentaires

On dirait que je dois changer mon $ .post () s appelle une méthode de contrôleur à $ .ajax (). Mais cela ressemble à ce que je fais quelque chose de mal et que cela devrait simplement fonctionner si contentType est la valeur par défaut de l'application / X-www-Form-Urlencodé.