Как создать текстовое поле readonly в ASP.NET MVC5 [duplicate]

Уже занятая тема, но из того, что я прочитал здесь, следующее помогло мне понять, как она работает внутри:

def bar(a=[]):
     print id(a)
     a = a + [1]
     print id(a)
     return a

>>> bar()
4484370232
4484524224
[1]
>>> bar()
4484370232
4484524152
[1]
>>> bar()
4484370232 # Never change, this is 'class property' of the function
4484523720 # Always a new object 
[1]
>>> id(bar.func_defaults[0])
4484370232
100
задан Shyju 6 January 2012 в 23:51
поделиться

7 ответов

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

Вы можете сделать HTML Helper для этого, но это просто атрибут HTML, как и любой другой. Вы сделаете HTML-помощник для текстового поля с другими атрибутами?

212
ответ дан user 21 August 2018 в 07:39
поделиться
  • 1
    @Shyju Извините, у меня отсутствовал префикс @ свойства readonly. См. Мое редактирование. – user 6 January 2012 в 19:36
  • 2
    В будущем, если вы получите какие-либо ошибки, добавляющие свойства к аргументу динамического объекта, вы можете префикс их с помощью @. Обычно вы видите только ключевые слова, соответствующие атрибутам HTML (например, readonly, class и т. Д.). – Brad Christie 6 January 2012 в 19:40
  • 3
    @BradChristie: Нет; вам нужно только @ использовать атрибуты, соответствующие ключевым словам C # . – SLaks 6 January 2012 в 19:55
  • 4
    @BradChristie: Я неправильно прочитал ваш комментарий («ключевые слова» было неоднозначным) – SLaks 6 January 2012 в 21:13
  • 5
    Если у вас есть несколько атрибутов html, вы можете сделать что-то вроде: @Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" }) – benscabbia 28 January 2017 в 18:20

с записями к предыдущему ответу @Bronek и @Shimmy

Это я сделал что-то в ASP.NET Core

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

. Первый вход - только для чтения и второй передает значение Контроллеру и скрыт. Надеюсь, это будет полезно для кого-то, кто работает с ASP.Net Core.

1
ответ дан Adithya Baddula 21 August 2018 в 07:39
поделиться
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

Это нормально для текстового поля. Однако, если вы попытаетесь сделать то же самое для checkbox, попробуйте использовать это, если вы используете его

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

Но не используйте disable, потому что отключить всегда отправлять значение по умолчанию false на сервер либо он был в проверенном или непроверенном состоянии. И readonly не работает для флажка и radio button. readonly работает только для полей text.

0
ответ дан gdmanandamohon 21 August 2018 в 07:39
поделиться
 @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
0
ответ дан Hossein Dahr 21 August 2018 в 07:39
поделиться

UPDATE: теперь очень просто добавить атрибуты html в шаблоны редактора по умолчанию. Вместо этого вы делаете это:

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

вы можете это сделать:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

Преимущества: вам не нужно называть .TextBoxFor и т. Д. Для шаблонов. Просто позвоните .EditorFor.


Хотя решение @ Shark работает правильно, и оно простое и полезное, мое решение (которое я всегда использую) - это создать файл editor-template, который может обрабатывать readonly:

  1. Создайте папку с именем EditorTemplates в ~/Views/Shared/
  2. Создайте бритву PartialView с именем String.cshtml
  3. Заполните String.cshtml с этим кодом:
    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })                                     
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" }) 
    }
    
  4. В классе модели поместите атрибут [ReadOnly(true)] в свойствах, которые вы хотите readonly.

, например

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

Теперь вы можете просто использовать синтаксис по умолчанию бритвы:

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

Первый, отображает нормальный text-box следующим образом:

<input class="text-box single-line" id="field-id" name="field-name" />

, а второй будет отображаться;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

Вы можете использовать это решение для любого типа данных (DateTime, DateTimeOffset , DataType.Text, DataType.MultilineText и т. д.). Просто создайте editor-template.

28
ответ дан javad amiry 21 August 2018 в 07:39
поделиться
  • 1
    +1, потому что вы использовали & quot; ViewData.ModelMetadata.IsReadOnly & quot ;. Я ожидал, что MVC учтет эти вещи в версии 4. – cleftheris 24 October 2012 в 12:00
  • 2
    @cleftheris хорошо, мы сейчас в версии 5, и MVC все равно их не брали;) – javad amiry 23 July 2014 в 20:59
  • 3
    Очень полезно - спасибо :) – Nildarar 24 July 2014 в 02:46
  • 4
    @Javad_Amiry - отличный ответ. Я реализовал его, и он отлично работал, пока я не нажал кнопку «Сохранить на странице редактирования». Затем выясняется, что Свойства с [ReadOnly (true)] приведут к отправке NULL в базу данных вместо реального значения свойства. Вы сталкивались с этим? – Rick 25 March 2015 в 21:11

Вы можете использовать нижеприведенный код для создания TextBox как доступного только для чтения.

Метод -1

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

Метод -2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
0
ответ дан Krishan Dutt Sharma 21 August 2018 в 07:39
поделиться

Решение с TextBoxFor в порядке, но если вы не хотите видеть стили (например, EditBox) (это может быть немного запутано для пользователя), используйте следующие изменения:

1. Код бритвы перед изменением

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

2. После изменений

<!-- new div display-field (after div editor-label) -->
<div class="display-field">
    @Html.DisplayFor(model => model.Text)
</div>

<div class="editor-field">            
    <!-- change to HiddenFor in existing div editor-field -->
    @Html.HiddenFor(model => model.Text)
    @Html.ValidationMessageFor(model => model.Text)
</div>

Обычно это решение отключается от редактирования, но показывает его значение. Нет необходимости в модификациях кода.

5
ответ дан Shimmy 21 August 2018 в 07:39
поделиться
  • 1
    Я думаю, что наличие CSS для полей редактора и поля отображения здесь может быть действительно полезным. – DOK 30 October 2014 в 19:36
Другие вопросы по тегам:

Похожие вопросы: