2012-04-11 4 views
56

Desidero eseguire la lettura con EditorFor nella pagina di modifica.MVC3 EditorPer readOnly

ho provato a mettere in sola lettura e disabili come:

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

Tuttavia, non funziona. Come posso fare per disabilitare la modifica di questo campo?

Grazie.

+5

Se è una sola lettura, allora non è più un editor. Dovrebbe probabilmente da DisplayFor –

+4

Fare un editor di tipo readonly sconfigge l'oggetto di esso. Perché non usare solo DisplayFor? – ChrisBint

+2

possibile duplicato di [come posso impostare l'attributo disabilitato su textbox html in asp.net-mvc?] (Http://stackoverflow.com/questions/3443460/how-do-i-set-disabled-attribute-on-html -textbox-in-asp-net-mvc) –

risposta

73

L'helper EditorFor html non ha sovraccarichi che richiedono attributi HTML. In questo caso, è necessario utilizzare qualcosa di più specifico come TextBoxFor:

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

È comunque possibile utilizzare EditorFor, ma è necessario avere un TextBoxFor in un EditorTemplate personalizzato:

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

Poi, in la tua cartella Views/Shared/EditorTemplates, crea un file userName.cshtml. In quel file, mettere questo:

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

Non riesco a trovare gli overload che consentono di specificare argomenti. C'è un altro metodo di estensione che ho perso? Impossibile trovarlo con Intellisense, né trovarlo nei documenti msdn: http://msdn.microsoft.com/en-us/library/ee834942(v=vs.100).aspx – JotaBe

+0

@JotaBe Penso che tu abbia ragione , ma pensavo di averli visti prima. Forse era nelle pre-release di MVC4, o forse l'avevo immaginato. Ad ogni modo, ho aggiornato la risposta. – danludwig

+1

Nelle versioni più recenti di MVC (credo 4+?) L'oggetto 'additionalViewData' può avere la proprietà' htmlAttributes' che 'EditorFor' e l'uso simile per gli attributi html. Quindi diventerà: '@ Html.EditorFor (model => model.userName, new {htmlAttributes = new {disabled =" disabled ", @readonly =" readonly "}})'. – GSerg

12

Per coloro che si chiedono il motivo per cui si desidera utilizzare un EditoFor se non volete che sia modificabile, ho un esempio.

Ho questo nel mio modello.

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

e quando si desidera visualizzare tale formato, l'unico modo in cui funziona è con un EditorFor, ma ho un datepicker jquery per questo "ingresso" quindi deve essere di sola lettura per evitare agli utenti di scrittura verso il basso date sbagliate.

Per farlo funzionare nel modo desiderato ho messo questo in vista ...

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

e questo nella mia funzione pronti ...

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

Spero che questo sarebbe utile per qualcuno là fuori Ci dispiace per il mio inglese

+0

Grazie, Seichi! Questa è la vera soluzione al problema esatto! –

+0

Questa è un'ottima risposta. Descrive ciò che la domanda originale è valida, oltre a rispondere effettivamente all'OP. Ottimo lavoro! – Rob10e

+0

Semplice risposta diretta grazie mille! I requisiti mi hanno fatto saltare avanti e indietro durante la revisione di un difetto mi sono reso conto che il mio cambiamento in editorfor ha permesso il mio desiderato DisplayFormating ma ho scoperto che non erano più letti solo questa era un'ottima scoperta !!! – ChristianProgrammer

1

Crea un EditorTemplate per un insieme specifico di Vista (vincolato da un Controller): enter image description here

In questo esempio ho un modello per una data, ma si può cambiare a tutto ciò che volere.

Ecco il codice nei dati.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" }) 

e nel modello:

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

Come crei un editor per tutte le viste? – Davor

3

Ecco come lo faccio:

Modello:

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

Vista:

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

Estensione:

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)); 
     } 
    } 
} 

Naturalmente il mio editore sta facendo una più roba gruppo, come l'aggiunta di un'etichetta, l'aggiunta di una classe richiesta a tale etichetta, se necessario, l'aggiunta di un DisplayFor se la proprietà è ReadOnlyEditorFor se non lo è, aggiungendo un ValidateMessageFor e infine avvolgendo tutto ciò in un Div che può essere assegnato a Html Attributes ad esso ... il mio Views è super pulito.

-1

Credo che questo sia semplice rispetto agli altri utilizzando [modificabile (true)] attributo

ad esempio:

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

aggiunta [Modificabile (falso)] non sembra fare nulla per rendere il controllo in sola lettura –

+0

si dovrebbe anche estendere InputTagHelper come ho spiegato nella mia risposta qui: https://stackoverflow.com/a/44639822/6339469 – HamedH

-1
<div class="editor-field"> 
     @Html.EditorFor(model => model.userName) 
</div> 

utilizzare jQuery per disattivare

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#userName').attr('disabled', true); 
    }); 
</script> 
20

Questo codice è supportato in MVC4 in poi

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

La chiave cambiamento è di avvolgere gli attributi html nelle "nuove {htmlAttributes =" "}" stringhe. Questo sembra essere un modello unico per EditorFor (diverso da DisplayFor, DropdownFor, ecc.) –

+1

questa dovrebbe essere la risposta accettata –

3

So che la questione afferma MVC 3, ma era il 2012, quindi nel caso in cui:

Come di MVC 5.1 è ora possibile passare attributi HTML EditorFor in questo modo:

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

Try utilizzando:

@Html.DisplayFor(model => model.userName) <br/> 
@Html.HiddenFor(model => model.userName) 
4

si può fare in questo modo:

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

Ho finalmente trovato una soluzione in MVC 4, grazie !! – ecasper

1

vecchio post, lo so .. ma ora si può fare questo per mantenere l'allineamento e tutti alla ricerca costante ..

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