2009-07-06 8 views
0

J'ai un ViewModel relativement complexe contenant les propriétés decimal, qui sont exposées à l'utilisateur sous la forme de zones de texte. Je veux une zone de texte sans valeur à interpréter comme zéro. (Les propriétés de l'objet domaine sous-jacent sont non nulles et la valeur par défaut est 0.)ASP.NET MVC: Liaison de types numériques à partir de chaînes vides sans erreurs ModelState

Lorsque le DefaultModelBinder lie les données d'affichage au ViewModel, les propriétés décimales avec des chaînes vides pour les entrées sont initialisées à zéro (comme standard dans .NET), mais le DefaultModelBinder ajoute des erreurs au ModelState pour les zones de texte vides. Par conséquent, ModelState n'est pas valide et l'utilisateur voit tout un tas de "Une valeur est requise". erreurs pour les zones de texte qu'ils ont laissées en blanc.

Comment puis-je empêcher l'ajout de ces erreurs au ModelState?

Répondre

1

La meilleure chose que vous pourriez faire dans cette situation est de créer un ViewModel. Au lieu de vous lier directement à votre modèle de domaine, vous devez plutôt vous lier au ViewModel qui a été créé uniquement pour le transfert de données vers votre vue. Sur ViewModel, vous pouvez créer ces champs sous la forme de nombres décimaux pouvant être annulés. Vous pouvez ensuite mapper le ViewModel à votre modèle de domaine comme vous le souhaitez.

C'est vraiment le comportement correct. Si vous n'entrez rien dans le TextBox alors cela équivaut à null, pas à 0.

+0

J'utilise déjà un ViewModel comme objet de transfert de données - je vais éditer la question pour clarifier. Je devrais refactoriser beaucoup de code pour utiliser des nombres décimaux nullables cependant, et j'espérais éviter cela. –

+0

Les ViewModels ne sont pas destinés à être utilisés dans plusieurs actions. Vous devriez avoir un nouveau ViewModel pour chaque Action qui nécessite des données uniques. En utilisant ViewModels génériques sur plusieurs actions, vous rencontrerez généralement des problèmes comme celui que vous rencontrez. –

Questions connexes