MVC3 Editor для чтения только
Я хочу сделать readOnly с 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 создайте файл userName.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 для этого "ввода", поэтому он должен быть доступен только для чтения, чтобы пользователи не могли записать неправильные даты.
Чтобы это работало так, как я хочу, я поместил это в View...
@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 } })
Я знаю вопрос о состоянии 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)
Вот как я это делаю:
Модель:
[ReadOnly(true)]
public string Email { get { return DbUser.Email; } }
Посмотреть:
@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
супер чистые
Старый пост я знаю.. но теперь вы можете сделать это, чтобы сохранить выравнивание и все выглядело согласованно..
@Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
Создайте шаблон EditorTemplate для определенного набора представлений (связанных одним контроллером):
В этом примере у меня есть шаблон для даты, но вы можете изменить его на любое другое.
Вот код в 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; }
Я использую readonly
атрибут вместо disabled
атрибут - так как он все равно будет отправлять значение, когда поле доступно только для чтения.
Примечание: любое присутствие атрибута только для чтения сделает поле readonly
даже если установлено значение false, поэтому, следовательно, я разветвляю редактор для кода, как показано ниже.
@if (disabled)
{
@Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control", @readonly = "" } })
}
else
{
@Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control" } })
}
<div class="editor-field">
@Html.EditorFor(model => model.userName)
</div>
Используйте jquery для отключения
<script type="text/javascript">
$(document).ready(function () {
$('#userName').attr('disabled', true);
});
</script>
Я думаю, что это проще, чем другие, используя атрибут [Editable(false)]
например:
public class MyModel
{
[Editable(false)]
public string userName { get; set; }
}