MVC3 EditorFor只读

我想用编辑页面中的EditorFor进行只读。

我试图把只读和禁用作为:

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

但是,它不起作用。 我怎样才能禁用编辑这个领域?

谢谢。

EditorFor的HTML帮手没有重载HTML属性。 在这种情况下,您需要使用更像TextBoxFor的特定内容:

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

您仍然可以使用EditorFor,但是您需要在自定义EditorTemplate中有一个TextBoxFor:

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

然后,在您的Views / Shared / EditorTemplates文件夹中,创build一个文件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的dateselect器,用于“input”,所以它必须是只读的,以避免用户写下错误的date。

为了使它以我想要的方式工作,我把它放在View …

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

这在我准备好的function…

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

我希望这将有助于外面的人。 对不起我的英语不好

你可以这样做:

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

以下是我如何做到这一点:

模型:

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

当然,我的编辑器正在做更多的事情,比如添加一个标签,根据需要添加一个必需的类到该标签中,如果该属性是ReadOnly EditorFor ,则添加一个DisplayFor否则添加一个ValidateMessageFor ,最后将所有这些包装到一个Div可以有Html Attributes分配给它…我的Views是超级干净。

我知道这个问题陈述MVC 3,但是是2012年,所以以防万一:

从MVC 5.1开始,您现在可以将HTML属性传递给EditorFor如下所示:

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

为一组特定的视图创buildEditorTemplate(由一个Controller绑定): 在这里输入图像说明

在这个例子中,我有一个date的模板,但你可以改变它到任何你想要的。

以下是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; } 

尝试使用:

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

旧post我知道..但现在你可以做到这一点,以保持alignment,所有看起来一致..

  @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>