2009-09-15 7 views
16

J'ai un Html.TextBox() et j'ai besoin de le désactiver dans certaines conditions. Avec le TextArea il va comme ceci:asp.net MVC: désactiver un TextBox

<%=primaryLang ? Html.TextArea("e.location", new { rows = 2, cols = 60 }) : Html.TextArea("e.location", new { rows = 2, cols = 60, disabled = "true" })%> 

Mais avec TextBox il est impossible:

<%=primaryLang ? 
     Html.TextBox("e.startDate") : 
     Html.TextBox("e.startDate", new { disabled = "true"})%> 

Il émettra {disabled = true} dans la valeur. C'est parce que la seule fonction qui vous permettra de passer le HtmlAttributes exigera également que le modèle soit passé. Ce point de vue est fortement typé, et le modèle est rempli automatiquement

Si je passe comme ceci:.

Html.TextBox("e.startDate", Model.e.startDate, new { disabled = "true"}) 

ou comme ceci:

Html.TextBox("e.startDate", null, new { disabled = "true"}) 

la version GET fonctionnera, mais la version POST émet une exception NullReferenceException. Les deux ci-dessus semblent avoir exactement le même effet. Les deux présenteront les données correctes du modèle sur GET.

Si je laisse la luxure comme ceci:

Html.TextBox("e.startDate") 

il sera correctement, pour les deux POST et GET ...

Pourquoi? Des moyens d'accomplir?

Merci! :)


Merci aux réponses ci-dessous, je l'ai résolu comme ceci:

<%=primaryLang ? 
     Html.TextBox("e.startDate") : 
      Html.Hidden("e.startDate") + Html.TextBox("e.startDate", null, new { disabled = "true"})%> 

Répondre

16

éléments HTML désactivés n'affichent pas sur le serveur. C'est pourquoi vous obtenez une exception NullReferenceException lorsque vous parvenez à désactiver votre élément. Je ne suis pas sûr de ce que vous essayez d'atteindre, mais si vous ne permettez pas à e.startDate d'être modifiable, vous ne devriez pas avoir besoin de le publier, car vous devriez déjà connaître la valeur. Vous avez donc deux options.

  1. Affichez e.startDate comme vous l'avez été, mais réglez simplement la valeur e.startDate de votre méthode de publication sur la valeur par défaut ou ignorez-la complètement.
  2. Si vous avez besoin de la valeur affichée, affichez e.startDate en tant qu'étiquette, puis ajoutez un champ masqué contenant e.startDate pour votre valeur retournée.

Avertissement: Tout simplement parce que l'élément est désactivé, il ne veut pas dire que quelqu'un ne peut pas modifier la valeur et l'afficher en arrière. C'est juste une recommandation. C'est au navigateur de voir comment afficher le champ. Si votre code POST accepte la valeur e.startDate, toute personne ayant un accès peut modifier ce champ à l'aide d'outils de développement.

+0

Voilà, c'est génial! Je l'ai résolu et édité la question avec ma solution de contournement (la coller ici perd toute indentation et est illisible). – Palantir

10

Sur le POST, la propriété "Modèle" ou "e" est probablement nulle.

Vous pouvez essayer ceci:

<%if (Model != null && Model.e != null) { %> 
<%=Html.TextBox("e.StartDate", Model.e.StartDate, primaryLang ? null : new { disabled = "disabled" })%> 
<%}%> 
Questions connexes