À l'aide d'attributs Modifiables sur MVC 3 modèle de vue
Je cherche à utiliser les attributs de la marque afficher les propriétés du modèle en readonly, de sorte que le point de vue des champs sont en lecture seule dans le rendu de la vue. L'Application Du Système.ComponentModel.DataAnnotations.EditableAttribute semble être l'exact attribut j'ai besoin, mais elle ne semble pas fonctionner c'est à dire zone de texte champs sont toujours modifiables. J'ai regardé tout autour et ne peuvent trouver de réponses et seulement quelques-unes des questions connexes. L'attribut modifiable appliquée ci-dessous ne fonctionne pas lorsque la vue est rendue.
[Display(Name = "Last Name")]
[Editable(false, AllowInitialValue = true)]
public string LastName { get; set; }
Que je peux atteindre les readonly comportement à l'aide d'un helper de vue de la fonction comme ça, mais ma préférence est d'utiliser un attribut sur le modèle de la propriété.
@functions {
object getHtmlAttributes()
{
if (@ViewBag.Mode == "Edit")
{
return new {style = "width:100px;background:#ff6;", @readonly = "readonly"};
}
return new { style = "width:100px;" };
}
}
@Html.TextBoxFor(model => model.FirstName, getHtmlAttributes())
Autres attributs fonctionnent parfaitement ok y compris personnalisés attributs de validation. Pouvez-vous me dire si les annotations de données d'attributs modifiables œuvres dans ce contexte, il doit travailler comme appliquée au-dessus ou est-il autre chose qui doit être fait? Merci.
OriginalL'auteur Steven Chalk | 2012-04-13
Vous devez vous connecter pour publier un commentaire.
La EditableAttribute documentation états:
Malheureusement, cela signifie que l'utilisation de cet attribut n'a aucun effet sur la validation dans MVC. Cela se sent mal, mais c'est logique, si vous pensez au sujet de ce qu'il faudrait pour mettre en œuvre dans le framework MVC. Par exemple, dans une typique "Modifier", l'utilisateur fait une première demande d'OBTENIR où le Modèle est rempli (généralement à partir d'une base de l'enregistrement) et compte tenu de l'avis rendu à l'utilisateur. Ensuite, l'utilisateur fait quelques modifications, puis soumet le formulaire. La soumission du formulaire entraîne une nouveau instance du Modèle construit à partir des paramètres POST. Il serait très difficile pour les validateurs pour s'assurer que le champ a la même valeur dans les deux instances de l'objet, parce que l'une des instances (la première de la requête GET) a déjà été éliminés.
Bien si l'Attribut n'a pas de fonctionnalité, pourquoi même pas la peine de l'utiliser?
Ma meilleure supposition est qu'ils attendent les développeurs à l'utiliser dans leur code pour afficher intention. Sur un plan plus pratique, vous pouvez également écrire votre propre code pour vérifier la présence de cet Attribut...
Également garder à l'esprit que ces attributs DataAnnotation ne sont pas seulement pour les applications MVC, ils peuvent être utilisés pour de nombreux types d'applications. Même si MVC ne pas faire quelque chose de spécial avec cet Attribut, d'autres cadres ont mis en œuvre la fonctionnalité de validation, pour cet attribut.
Heureux de voir que vous avez trouvé une solution! J'ai constitué une solution similaire à la vôtre dans mon projet.
OriginalL'auteur Jesse Webb
Seulement semi-résolu ce problème moi-même.
[HiddenInput(DisplayValue=true)]
Le champ est affiché mais pas modifiables.
HiddenInputAttribute
est dans leSystem.Mvc
espace de noms. Voici la doc. Si vous êtes l'annotation de votre modèle d'affaires classes au lieu d'utiliser des ViewModels, il ne fait pas de sens pour faire de votre Modèle d'entreprise dépend de la MVC. Si, en revanche, vous utilisez Viewmodel avec des annotations, cet Attribut de travail sans aucun code supplémentaire.OriginalL'auteur panzerblitzer
Avez-vous de créer un autre scénario? Une raison particulière, vous permettant à une valeur initiale? Je demande parce que la la documentation dit:
Je suis en train de penser si vous affectez la valeur false et ne pas déclarer explicitement le
AllowInitialValue
il va travailler.Ya je l'ai recueillie, était en train de dire que si vous continuez comme faux, il doit travailler. Cela fonctionne quand il est réglé sur faux? Aujourd'hui, je vois que vous avez 2 scénarios, mais juste curieux de savoir si au moins l'un d'entre eux fonctionne.
J'ai utilisé l'attribut modifiable, d'abord et sans application de la AllowInitialValue et aussi avec AllowInitialValue explicitement définie sur false. Aucune combinaison semble fonctionner.
OriginalL'auteur Terry
Constaté que l'utilisation de Modifiable au lieu Readonly sur le modèle fonctionne exactement de la même.
Cette syntaxe fonctionne lors de l'examen d'un attribut de propriété sur la vue elle-même. Fonctionne également lorsque l'attribut est Modifiable(true)
À l'aide d'un éditeur de modèle ici un simple modèle de chaîne:
OriginalL'auteur Steven Chalk
ne sais pas si vous avez compris cela, mais nous utilisons
utilisation
false
dans la vue.OriginalL'auteur Steven