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


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

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

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

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

спасибо.

11 57

11 ответов:

помощник EditorFor html не имеет перегрузок, которые принимают атрибуты 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 создайте имя пользователя файла.cshtml. В этом файле, положите это:

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

этот код поддерживается в MVC4 и далее

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

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

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

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

и когда вы хотите отобразить этот формат, единственный способ, которым он работает, - это EditorFor, но у меня есть jQuery datepicker для этого "ввода", поэтому он должен быть только для чтения, чтобы избежать пользователей записи неправильных дат.

чтобы заставить его работать так, как я хочу я положил это в Вид...

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

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

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

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

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

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

вот как я делаю это:

модель:

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

View:

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

:

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 если свойство ReadOnlyEditorFor если его не добавлять ValidateMessageFor и, наконец, обернув все это в Div что может быть Html Attributes назначенный ему... мой Views супер чистый.

Я знаю, что вопрос гласит MVC 3, но это был 2012 год, так что на всякий случай:

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

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

попробуйте использовать:

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

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

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

вот код, в данные.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; }

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

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

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

например:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }
<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

используйте jquery для отключения

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