6

Dans une vue J'utilise this overload de HtmlHelper.TextBox:HtmlHelper.TextBox utilise la valeur de modèle, même si une valeur explicite fournie

public static MvcHtmlString TextBox(
    this HtmlHelper htmlHelper, 
    string name, 
    Object value 
) 

Les états de documentation:

valeur

Type: System.Object

La valeur de l'élément d'entrée de texte. Si cette valeur est null, la valeur de l'élément est extraite de l'objet ViewDataDictionary. Si aucune valeur n'existe, la valeur est extraite de l'objet ModelStateDictionary.

où je fournirais un value quand je l'appelle cette surcharge, et cette valeur est non nulle. Néanmoins, la valeur de la zone de texte est récupérée à partir du ModelStateDictionary chaque fois qu'il y est présent. Pour forcer la zone de texte à utiliser la valeur fournie en ligne, je dois d'abord réinitialiser le modèle dans le contrôleur (ou supprimer la clé avec le nom de la zone de texte de la collection de clés).

La même chose s'applique aux autres contrôles rendus par HtmlHelper.

Où est-ce que ma compréhension est erronée? Ou est-ce un bug dans la documentation?

Répondre

2

ModelState a toujours la priorité dans tous les aides d'entrée, pas seulement TextBox. Cela vous permet de spécifier une valeur par défaut dans la vue, et après le POST de rendre la valeur affichée (provenant de ModelState) sans avoir à passer manuellement la valeur affichée à la vue. Pour utiliser une valeur différente, vous devez supprimer l'entrée de ModelState.

+0

Oui, c'est ce que j'observe, mais pas ce qui est documenté pour arriver. D'où la question. – GSerg

+2

@GSerg La documentation est incorrecte. –

1

Voici comment le classeur de modèle fonctionne, il prend les valeurs du modèle, probablement pour préserver les valeurs d'un échec de publication ou de validation. Avez-vous essayé d'utiliser les attributs Html pour définir la valeur

Html.TextBox("Id", new { Value = Model.Id}) 

Si

+1

Oui, je sais comment fonctionne la reliure de modèle. Cela me semble bizarre que cela ne fonctionne pas apparemment comme cela fonctionne. – GSerg

-1

Peut-être que cela vous aidera.

En utilisant viewmodel la propriété ci-dessous et Viewdata [ « textboxvalue »]

public string Id { get; set; } 

Si vous avez fourni un objet qui peut être lié au paramètre « valeur », le l'assistant html utilisera toujours sa valeur.

valeur boîte -Text liée à voir le modèle - ceux-ci montrent l'ID de modèle

@Html.TextBox("Id", Model.Id) 

boîte -Text avec valeur fournie à la vue des données - celles-ci montrent la valeur des données de vue

@Html.TextBox("Id", ViewData["textboxvalue"]) 

Même si le nom fourni n'est pas le même que le nom de la propriété, la valeur sera toujours celle fournie par le modèle

- Valeur de la boîte textuelle liée au modèle - Affiche l'identifiant du modèle

@Html.TextBox("Id2", Model.Id) 

boîte -Text avec valeur fournie à la vue des données - celles-ci montrent la vue la valeur des données

@Html.TextBox("Id2", ViewData["textboxvalue"]) 

Si vous fournissez votre propre coutume

boîte -Text avec fourni valeur hardcoded - le montre la chaîne fournie dans la vue

@Html.TextBox("Id", "my hardcoded value in view") 

La documentation indique - si vous ne remplit pas le paramètre « valeur », comme dans le ci-dessous:

@Html.TextBox("Id", null) 

cadre Alors mvc essaiera automatiquement et la recherche à la fois le modèle qui est lié à la vue et le dictionnaire de données.

Si vous avez ce cas,

-Found une propriété appelée « Id » dans le modèle de vue. zone de texte Valeur définie sur la valeur du modèle

@Html.TextBox("Id", null) 

Mais si la valeur « nom » est pas une propriété/clé dans le modèle/dictionnaires, le cadre n'a pas pu trouver une valeur, la valeur de zone de texte sera une chaîne vide

boîte -Text avec le nom qui ne sont pas la propriété dans les données du modèle de vue ou vue

@Html.TextBox("Id2", null) 
+0

Désolé, mais avez-vous lu ma question? – GSerg

Questions connexes