web-dev-qa-db-fra.com

MVC3 EditorPour readOnly

Je veux faire readOnly avec EditorFor dans la page d'édition.

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

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

Cependant, ça ne marche pas. Comment puis-je faire pour désactiver éditer ce champ?

Je vous remercie.

60
wholee1

Le helper EditorFor pour HTML n'a pas de surcharges qui utilisent des attributs HTML. Dans ce cas, vous devez utiliser quelque chose de plus spécifique, tel que 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'un TextBoxFor dans un EditorTemplate personnalisé:

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

Ensuite, dans votre dossier Views/Shared/EditorTemplates, créez un fichier userName.cshtml. Dans ce fichier, mettez ceci:

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

Ce code est supporté à partir de MVC4

@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
25
GSoft Consulting

Pour ceux qui se demandent pourquoi vous voulez utiliser un EditoFor, si vous ne voulez pas qu’il soit éditable, j’en 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 cela fonctionne est avec EditorFor, mais j'ai un sélecteur de date jquery pour cette "entrée", il doit donc être en lecture seule pour éviter aux utilisateurs d'écrire des dates erronées.

Pour que cela fonctionne comme je le veux, je mets ceci dans la vue ...

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

et ceci dans ma fonction prête ...

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

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

12
Seichi

Vous pouvez le faire de cette façon:

@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
5
Francois

Je sais que la question dit MVC 3, mais c'était 2012, donc juste au cas où:

À partir de MVC 5.1, vous pouvez maintenant transmettre les attributs HTML à EditorFor comme ceci:

@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
3
stovroz

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 en fait beaucoup plus, comme ajouter une étiquette, ajouter une classe requise à cette étiquette si nécessaire, ajouter un DisplayFor si la propriété est ReadOnlyEditorFor sinon, ajouter un ValidateMessageFor et finalement envelopper tout cela Div auquel Html Attributes peut être attribué ... mes Views sont super propres.

3
Serj Sagan

Essayez d'utiliser:

@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
3
Mohamed Ashraf

Ancien message que je connais .. mais maintenant, vous pouvez le faire pour conserver un alignement et une apparence homogène ..

 @Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
1
da_jokker

Créez 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 changer comme vous le souhaitez.

Voici le code dans le Data.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; }
1
DaniilZ

J'utilise l'attribut readonly au lieu de l'attribut disabled - car il soumettra toujours la valeur lorsque le champ est en lecture seule.

Note : Toute présence de l'attribut readonly rendra le champ readonly même s'il est défini sur false, d'où la raison pour laquelle je branche l'éditeur pour le code comme ci-dessous.

 @if (disabled)
 {
     @Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control", @readonly = "" } })
 }
 else
 {
     @Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control" } })
 }
0
john blair