Les champs de formulaire masqué ne figurant pas dans le Modèle MVC après le post-retour
J'ai un nouveau MVC 4 Application avec une assez basique Vue/Contrôleur. Le Modèle associé contient un certain nombre de propriétés que j'ai mappé à Caché des champs de formulaire. Lorsque la Page s'affiche la première fois (, par exemple via les HttpGet Action), tout a l'air très bien. Mais lorsque le formulaire est en Post ed en sélectionnant le bouton Soumettre le Modèle présenté à l'Action n'a plus le champ Caché ensemble de valeurs. Voici un pas à pas les indications.
Voici un échantillon de la Modèle:
public class Application
{
public bool ShowSideBars { get; set; }
}
Ici est la première Contrôleur *Action* (qui semble bien fonctionner):
[HttpGet]
public ActionResult Application()
{
var model = Request.ParseFromQueryString<Application>();
model.ShowSideBars = true;
return View(model);
}
Il correspond à la Vue comme suit:
<fieldset>
@Html.HiddenFor(m => m.ShowSideBars)
...
</fieldset>
Cette résultats dans la suite de mark-up être rendu à l'intérieur du fieldset:
<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" />
Note: je voudrais bien que je savais pourquoi MVC a décidé d'ajouter le "... le terrain est nécessaire de contenu " quand je n'ai pas le marquer comme nécessaire, mais c'est une autre question
Ici est la Action qui est appelée lorsque le formulaire est soumis. À ce stade, les biens susmentionnés n'est plus fixé à 'vrai'.
[HttpPost]
public ActionResult Application(Application application)
{
//Other work done here
return View(application);
}
À l'heure actuelle, il n'existe pas de Modèle personnalisé Liants. Aussi, j'ai testé quelques autres types de données et je vois la même chose.
Quelqu'un peut m'expliquer pourquoi la forme cachée valeurs ne sont pas retournés? Suis-je juste le faire tout faux?
data-val-required
est en cours de rendu, parce que le modèle type est bool
. Bool par défaut sont requis, ils doivent être vraie ou fausse. Si vous ne voulez pas voir les données-val-requis, de faire de la propriété un bool?
.En aparté, les Annotations de Données ajoute "requis" pour tout type non nullable. Entiers et les Booléens va automatiquement être marqué comme requis.
Excellente idée! merci. Cela permettra d'éviter un peu de ballonnement dans l'ensemble de la taille de la page.
Est le ShowSlideBars initialement sur la chaîne de requête?
Je suis en supposant que vous avez enveloppé le champ dans un formulaire appelé "demande" et que vous êtes de passage à d'autres champs vers le modèle qui s'rempli?
OriginalL'auteur JoeGeeky | 2012-03-19
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas reproduire le problème (ASP.NET MVC 4 Beta en cours d'exécution sur VS 2010 .NET 4.0).
Modèle:
Contrôleur:
Vue:
Lorsque je soumets le formulaire, le modèle de liaison correctement attribue le
ShowSideBars
propriété dans le POST d'action pour vrai.C'est parce que les types nullables comme les booléens sont toujours requis. Vous pourriez arrêter ASP.NET MVC aides d'émettre HTML5 de données* la validation côté client attributs pour eux en mettant la ligne suivante dans
Application_Start
:Je crois MVC marqué le terrain en cas de nécessité, car bool n'est pas un type nullable. Si vous souhaitez supprimer l'exigence, vous devez utiliser le type bool? comme le type.
OriginalL'auteur Darin Dimitrov
Si vous avez la propriété dans votre modèle décoré avec un ReadOnlyAttribute la valeur ne sera pas peuplé de retour dans le modèle pour vous. Après tout, il est en lecture seule.
j'ai eu un bien qui était en 'interne' ensemble. yep, qu'il a fait (vs aide pour l'ajout de propriétés à partir du code écrit par l'ajout de la propriété interne
OriginalL'auteur Richard Beverly
Je pense que les champs DOIVENT être dans la forme de balises html pour ceux qui sont cachés à être affichés en arrière et pas ignoré
OriginalL'auteur iberodev
J'ai juste eu le même problème. Le formulaire n'est pas soumis à la propriété hidden parce que le modèle de classe n'a pas eu un bon getter et setter pour cette propriété.
Je sais que c'est pas le problème que vous, juste pensé qu'il pourrait aider d'autres personnes qui se prêtent à cette page.
internal set;
pour setter, la valeur ne sera pas affiché.OriginalL'auteur Ravid Goldenberg
essayez ceci:
plus d'infos ici (ScaffoldColumn(bool valeur) vs HiddenInput(DisplayValue = bool valeur) en MVC)
OriginalL'auteur Ludwo
Dans mon cas, c'était parce que j'avais déclaré un champ au lieu d'une propriété:
ne fonctionne pas. Mais:
œuvres. Le modèle de classeur par défaut ne fonctionne qu'avec les propriétés.
OriginalL'auteur toddmo
Je ne plaisante pas, c'est une autre raison, il pourrait se produire.
Mon formulaire a eu le même champ en deux fois. L'autre champ n'était pas dans la forme, mais qui n'a pas d'importance.
Exécuter cette jQuery dans la console développeur de voir comment de nombreux éléments reviennent:
Exemple:
OriginalL'auteur Jess