70

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

我试图将 readonly 和 disabled 设置为:

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

但是,它不起作用。如何禁用编辑此字段?

谢谢你。

4

12 回答 12

98

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 文件夹中,创建文件 userName.cshtml。在该文件中,输入以下内容:

@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })
于 2012-04-11T18:13:35.807 回答
34

此代码在 MVC4 及更高版本中受支持

@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
于 2015-11-13T17:12:49.550 回答
13

对于那些想知道如果您不希望 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);

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

于 2013-05-17T16:14:19.423 回答
6

你可以这样做:

@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
于 2016-08-31T07:02:21.430 回答
5

我知道问题说明了 MVC 3,但那是 2012 年,所以以防万一:

从 MVC 5.1 开始,您现在可以EditorFor像这样传递 HTML 属性:

@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
于 2016-04-13T23:35:39.993 回答
4

尝试使用:

@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
于 2016-05-04T10:22:22.927 回答
3

这是我的做法:

模型:

[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如果属性是则添加 a 如果ReadOnly EditorFor不是,添加 aValidateMessageFor最后将所有内容包装在Div可以Html Attributes分配的 a 中对它...我Views的超级干净。

于 2013-11-04T23:45:08.610 回答
1

为一组特定的视图创建一个 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; }
于 2013-08-05T17:12:27.967 回答
1

我使用readonly属性而不是disabled属性 - 因为当字段为只读时,这仍会提交值。

注意:任何 readonly 属性的存在都会使该字段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" } })
 }
于 2019-04-06T11:32:05.810 回答
1

我知道旧帖子..但现在你可以这样做以保持对齐并且看起来一致..

 @Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
于 2016-10-05T16:11:20.483 回答
0
<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

使用 jquery 禁用

<script type="text/javascript">
   $(document).ready(function () {
      $('#userName').attr('disabled', true);
     });
</script>
于 2014-08-20T19:32:42.883 回答
-1

我认为这比使用 [Editable(false)] 属性更简单

例如:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }
于 2014-01-17T09:01:02.567 回答