2012-04-11 12 views
56

Chcę dokonać readOnly za pomocą EditorFor na stronie edycji.Edytor MVC3 Tylko do odczytu

Starałem się umieścić tylko do odczytu i niepełnosprawnych jak:

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

Jednak to nie działa. Jak mogę wyłączyć edycję tego pola?

Dziękuję.

+5

Jeśli jest tylko do odczytu, to nie jest już redaktorem. Najprawdopodobniej przez DisplayFor –

+4

Tworzenie edytora tylko raz pokonuje jego obiekt. Dlaczego nie skorzystać z DisplayFor? – ChrisBint

+2

możliwy duplikat [jak ustawić wyłączony atrybut w html textbox w asp.net-mvc?] (Http://stackoverflow.com/questions/3443460/how-do-i-set-disabled-attribute-on-html -textbox-in-asp-net-mvc) –

Odpowiedz

73

The EditorFor html helper nie ma przeciążeń, które mają atrybuty HTML. W tym przypadku trzeba użyć czegoś bardziej konkretnego jak TextBoxFor:

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

Można nadal używać EditorFor, ale trzeba mieć TextBoxFor w niestandardowym EditorTemplate:

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

Następnie w w folderze Widoki/Shared/EditorTemplates, utwórz plik nazwa_użytkownika.cshtml. W tym pliku, umieścić to:

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

Nie mogę znaleźć przeciążeń, które pozwalają określić argumenty. Czy istnieje inna metoda rozszerzenia, którą przeoczyłem? Nie można go znaleźć w Intellisense, ani znaleźć w dokumentach msdn: http://msdn.microsoft.com/en-us/library/ee834942(v=vs.100).aspx – JotaBe

+0

@JotaBe Myślę, że masz rację , ale myślałem, że już to widziałem. Być może było to w przedpremierach MVC4, a może ja to sobie wyobrażałem. Tak czy inaczej, zaktualizowałem odpowiedź. – danludwig

+1

W nowszych wersjach MVC (wydaje mi się, że 4+?) Obiekt 'additionalViewData' może mieć właściwość' htmlAttributes', której 'EditorFor' i podobne używają dla atrybutów html. Tak więc stanie się to: '@ Html.EditorFor (model => model.userName, nowy {htmlAttributes = new {disabled =" disabled ", @readonly =" readonly "}})'. – GSerg

12

dla tych, którzy zastanawiają się, dlaczego chcesz używać EditoFor jeśli don `t ma to być edytowane, mam przykład.

Mam to w moim modelu.

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

i kiedy chcesz wyświetlić ten format, jedynym sposobem działania jest z EditorFor, ale mam datepicker jquery dla tego „wejścia”, więc to musi być tylko do odczytu, aby uniknąć użytkownikom pisanie w dół niewłaściwe daty.

Aby to działało tak, jak chcesz umieścić to w widoku z perspektywy ...

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

i to w moim gotowej funkcji ...

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

Mam nadzieję, że to byłoby pomocne dla kogoś tam. Przepraszam za mój angielski

+0

Dziękuję Seichi! To jest prawdziwe rozwiązanie dokładnie tego problemu! –

+0

To jest świetna odpowiedź. Opisuje, jakie pierwotne pytanie jest ważne, a także odpowiada na OP. Dobra robota! – Rob10e

+0

Prosta odpowiedź bezpośrednia dziękuję bardzo! Wymagania skłaniały mnie do przeskakiwania w tę iz powrotem podczas przeglądania wady Uświadomiłem sobie, że moja zmiana na redaktor pozwoliła mi na pożądane działanie DisplayFormating, ale odkryłem, że nie były już czytane tylko to było świetne znalezisko !!! – ChristianProgrammer

1

Załóż EditorTemplate dla określonego zestawu widoków (związany przez jeden kontroler): enter image description here

W tym przykładzie mam szablon na randkę, ale można go zmienić na cokolwiek chcieć.

Oto kod w danych.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" }) 

aw modelu

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

Jak utworzyć edytor dla wszystkich widoków? – Davor

3

Oto jak to zrobić:

Model:

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

Widok:

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

Rozszerzenie:

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

Oczywiście mój wydawca robi banda więcej rzeczy, jak dodawanie etykietę, dodając wymaganą klasę do tej etykiety stosownie do potrzeb, dodając DisplayFor jeżeli nieruchomość jest ReadOnlyEditorFor Jeśli nie, dodanie ValidateMessageFor i ostatecznie owijanie tego w Div, które może być przypisane Html Attributes ... moim Views są super czyste.

-1

i że to prostsze niż inne przy użyciu [edycji (fałsz)] atrybutów

na przykład:

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

dodanie [edytowalne (fałsz)] nie wydaje się nic zrobić, aby uzyskać kontrolę tylko do odczytu –

+0

powinieneś również rozszerzyć InputTagHelper, jak wyjaśniłem w mojej odpowiedzi tutaj: https://stackoverflow.com/a/44639822/6339469 – HamedH

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

Zastosowanie jQuery wyłączyć

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

ten kod jest obsługiwany w MVC4

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

Klucz zmiana polega na zawijaniu atrybutów html w łańcuchach "new {htmlAttributes =" "}"}. Wydaje się, że jest to wyjątkowy wzorzec dla EditorFor (inny niż DisplayFor, DropdownFor, itp.). –

+1

to powinno być teraz zaakceptowaną odpowiedzią –

3

wiem kwestia stwierdza MVC 3, ale było to 2012, więc na wszelki wypadek:

Od MVC 5.1 można teraz przejść HTML atrybuty EditorFor tak:

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

Try przy użyciu:

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

można zrobić to w ten sposób:

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

W końcu znalazłem rozwiązanie w MVC 4, dzięki! – ecasper

1

Stary post wiem .. ale teraz można to zrobić, aby zachować ustawienie i wszystko patrząc spójne ..

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