MVC3 Editor для чтения только

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

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

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

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

Спасибо.

 ChrisBint11 апр. 2012 г., 17:34
Создание редактора только для чтения побеждает объект этого. Почему бы просто не использовать DisplayFor?
 user33819511 апр. 2012 г., 17:34
Если он доступен только для чтения, то он больше не является редактором. Должно быть, по DisplayFor
 Greg Terrell14 июл. 2016 г., 13:23
Причина, по которой можно захотеть сделать пользователя EditorFor (но отключенным), - это внешний вид, вот почему DisplayFor создает текстовый вывод без рамки и должен быть отрегулирован CSS для правильного выравнивания в форме (не сложно, просто верхний отступ). Но вы можете захотеть иметь форму со всеми полями в полях, а значения ReadOnly будут выделены серым цветом.
 Kyle Trauberman11 апр. 2012 г., 17:40

Ответы на вопрос(11)

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

например:

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

кто интересуется, почему вы хотите использовать 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);

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

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

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 супер чистые

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

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

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

(связанных одним контроллером): 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; }
 24 мар. 2014 г., 13:47
Как бы вы сделали редактор для всех просмотров?
Решение Вопроса

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

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

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

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

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

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

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

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

Ваш ответ на вопрос