Вопрос по readonly, asp.net-mvc-3, editorfor – MVC3 Editor для чтения только

60

Я хочу сделать readOnly с EditorFor на странице редактирования.

Я пытался поставить только для чтения и отключен как:

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

Однако это не работает. Как сделать так, чтобы отключить редактирование этого поля?

Спасибо.

возможный дубликатhow do i set disabled attribute on html textbox in asp.net-mvc? Kyle Trauberman
Создание редактора только для чтения побеждает объект этого. Почему бы просто не использовать DisplayFor? ChrisBint
Если он доступен только для чтения, то он больше не является редактором. Должно быть, по DisplayFor user338195
Причина, по которой можно захотеть сделать пользователя EditorFor (но отключенным), - это внешний вид, вот почему DisplayFor создает текстовый вывод без рамки и должен быть отрегулирован CSS для правильного выравнивания в форме (не сложно, просто верхний отступ). Но вы можете захотеть иметь форму со всеми полями в полях, а значения ReadOnly будут выделены серым цветом. Greg Terrell

Ваш Ответ

11   ответов
-1

что это проще, чем другие, используя атрибут [Editable (false)]

например:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }
добавление [Editable (false)], похоже, ничего не делает для того, чтобы сделать элемент управления доступным только для чтения.
Вы также должны расширить InputTagHelper, как я объяснил в моем ответе здесь:stackoverflow.com/a/44639822/6339469
84

которые принимают атрибуты HTML. В этом случае вам нужно использовать что-то более конкретное, например TextBoxFor:

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

Вы все еще можете использовать EditorFor, но вам нужно будет иметь TextBoxFor в пользовательском шаблоне EditorTemplate:

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

Затем в папке Views / Shared / EditorTemplates создайте файл userName.cshtml. В этом файле поместите это:

@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })
В более новых версиях MVC (я верю 4+?)additionalViewData объект может иметьhtmlAttributes свойство, котороеEditorFor и тому подобное использование для атрибутов HTML. Так и станет:@Html.EditorFor(model => model.userName, new { htmlAttributes = new { disabled = "disabled", @readonly = "readonly" } }).
@JotaBe Я думаю, что вы правы, но я думал, что видел это раньше. Возможно это было в предварительных выпусках MVC4, или возможно я вообразил это. В любом случае, я обновил ответ.
Я не могу найти перегрузки, которые позволяют указывать аргументы. Есть ли другой способ расширения, который я пропустил? Не могу найти его с помощью Intellisense, а также не найти его в документации MSDN:msdn.microsoft.com/en-us/library/ee834942(v=vs.100).aspx
3

но это был 2012 год, так что на всякий случай:

Начиная с MVC 5.1, теперь вы можете передавать атрибуты HTMLEditorFor вот так:

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

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

чтобы сохранить выравнивание и все выглядело согласованно ..

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

Model:

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

View:

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

Конечно, мой редактор делает кучу других вещей, таких как добавление метки, добавление необходимого класса к этой метке по мере необходимости, добавлениеDisplayFor если свойствоReadOnly EditorFor если его нет, добавивValidateMessageFor и, наконец, завернуть все это вDiv что может иметьHtml Attributes назначен на это ... мойViews супер чистые

25

@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
теперь это должен быть принятый ответ
Главное изменение заключается в том, чтобы обернуть атрибуты html в & quot; new {htmlAttributes = & quot; & lt; ваши нужные атрибуты & gt; & Quot;} & Quot; строки. Это уникальный шаблон для EditorFor (отличается от DisplayFor, DropdownFor и т. Д.)
6

@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
Я наконец нашел решение в MVC 4 ,, Спасибо !!
1

(связанных одним контроллером): enter image description here

В этом примере у меня есть шаблон для даты, но вы можете изменить его на любое другое.

Вот код в 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" }) 

и в модели:

[DataType(DataType.Date)]
public DateTime? BlahDate { get; set; }
Как бы вы сделали редактор для всех просмотров?
-1
<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

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

кто интересуется, почему вы хотите использовать EditoFor, если вы не хотите, чтобы он был редактируемым, у меня есть пример.

У меня есть это в моей модели.

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

и когда вы хотите отобразить этот формат, он работает только с EditorFor, но у меня есть средство выбора даты jquery для этого & quot; ввода & quot; поэтому он должен быть доступен только для чтения, чтобы пользователи не записывали неправильные даты.

Чтобы заставить это работать так, как я хочу, я поместил это в View ...

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

и это в моей готовой функции ...

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

Я надеюсь, что это будет полезно для кого-то там. Извините за мой английский

Спасибо, Сейчи! Это реальное решение точной проблемы!
Простой прямой ответ большое спасибо! Требования заставляли меня прыгать взад и вперед при рассмотрении дефекта. Я понял, что мои изменения в редакторе позволили мне желаемый DisplayFormating, но я обнаружил, что они больше не читаются, только это была отличная находка !!!
Это отличный ответ. Он описывает, что является первоначальным вопросом, а также фактически отвечает на OP. Прекрасная работа!

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