В MVC3 только для чтения
Я хочу сделать только для чтения с EditorFor на странице редактирования.
Я попытался поставить только для чтения и отключен как:
<div class="editor-field">
@Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
</div>
однако, это не работает. Как я могу отключить редактирование этого поля?
спасибо.
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
если свойствоReadOnly
EditorFor
если его не добавлять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 для определенного набора представлений (связанных одним контроллером):
в этом примере у меня есть шаблон для даты, но вы можете изменить его на все, что вы хотите.
вот код, в данные.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" } })