68 votes

MVC3 EditorFor readOnly

Je veux faire readOnly avec EditorFor dans modifier la page.

J'ai essayé de le mettre en lecture seule et désactivé:

<div class="editor-field">
        @Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
    </div>

Toutefois, il ne fonctionne pas. Comment puis-je faire pour désactiver la modification de ce champ?

Je vous remercie.

94voto

danludwig Points 19213

Le EditorFor helper html n'a pas de surcharges qui prennent des attributs HTML. Dans ce cas, vous devez utiliser quelque chose de plus spécifique comme TextBoxFor:

<div class="editor-field">
    @Html.TextBoxFor(model => model.userName, new 
        { disabled = "disabled", @readonly = "readonly" })
</div>

Vous pouvez toujours utiliser EditorFor, mais vous aurez besoin d'avoir un TextBoxFor personnalisé dans un EditorTemplate:

public class MyModel
{
    [UIHint("userName")]
    public string userName { ;get; set; }
}

Puis, dans votre Views/Shared/EditorTemplates dossier, créer un fichier de nom d'utilisateur.cshtml. Dans ce fichier, mettez ceci:

@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })

13voto

Seichi Points 21

Pour ceux qui se demandent pourquoi vous voulez utiliser un EditoFor si vous ne voulez pas qu'il soit modifiable, j'ai un exemple.

J'ai ceci dans mon Modèle.

    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0: dd/MM/yyyy}")]
    public DateTime issueDate { get; set; }

et lorsque vous souhaitez afficher ce format, la seule façon dont il fonctionne, c'est avec un EditorFor, mais j'ai un datepicker de jquery pour que "l'entrée" de sorte qu'il doit être en lecture seule pour éviter que les utilisateurs de l'écriture vers le bas de fausses dates.

Pour le faire fonctionner comme je veux, j'ai mis cela dans la Vue...

     @Html.EditorFor(m => m.issueDate, new{ @class="inp", @style="width:200px", @MaxLength = "200"})

et c'est à mon prêt de la fonction...

     $('#issueDate').prop('readOnly', true);

J'espère que cela serait utile pour quelqu'un là-bas. Désolé pour mon anglais

3voto

Serj Sagan Points 2731

Voici comment je le fais:

Modèle:

[ReadOnly(true)]
public string Email { get { return DbUser.Email; } }

Vue:

@Html.TheEditorFor(x => x.Email)

Extension:

namespace System.Web.Mvc
{
    public static class CustomExtensions
    {
        public static MvcHtmlString TheEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
        {
            return iEREditorForInternal(htmlHelper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
        }

        private static MvcHtmlString iEREditorForInternal<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
        {
            if (htmlAttributes == null) htmlAttributes = new Dictionary<string, object>();

            TagBuilder builder = new TagBuilder("div");
            builder.MergeAttributes(htmlAttributes);

            var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);


            string labelHtml = labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression).ToHtmlString();

            if (metadata.IsRequired)
                labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression, new { @class = "required" }).ToHtmlString();


            string editorHtml = Html.EditorExtensions.EditorFor(htmlHelper, expression).ToHtmlString();

            if (metadata.IsReadOnly)
                editorHtml = Html.DisplayExtensions.DisplayFor(htmlHelper, expression).ToHtmlString();


            string validationHtml = Html.ValidationExtensions.ValidationMessageFor(htmlHelper, expression).ToHtmlString();

            builder.InnerHtml = labelHtml + editorHtml + validationHtml;

            return new MvcHtmlString(builder.ToString(TagRenderMode.Normal));
        }
    }
}

Bien sûr, mon éditeur est en train de faire un tas de nouveaux trucs, comme l'ajout d'une étiquette, l'ajout d'une classe à l'étiquette en tant que de besoin, ajouter un DisplayFor si le bien est - ReadOnly EditorFor si ses pas, l'ajout d'un ValidateMessageFor et, enfin, l'enveloppant dans un Div que peut avoir l' Html Attributes , est attribué à... mon Views sont super propres.

1voto

DaniilZ Points 31

Créer un EditorTemplate pour un ensemble spécifique de Vues (lié par un Contrôleur): enter image description here

Dans cet exemple j'ai un modèle pour une Date, mais vous pouvez le modifier comme vous le souhaitez.

Voici le code dans les Données.cshtml:

@model Nullable<DateTime>

@Html.TextBox("", @Model != null ? String.Format("{0:d}",     ((System.DateTime)Model).ToShortDateString()) : "", new { @class = "datefield", type =    "date", disabled = "disabled"  @readonly = "readonly" }) 

et dans le modèle:

[DataType(DataType.Date)]
public DateTime? BlahDate { get; set; }

-1voto

MaTya Points 187

je pense que c'est simple que les autres en utilisant le [Modifiable(false)] attribut

par exemple:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X