MVC3 EditorFor readOnly

时间:2012-04-11 15:33:24

标签: asp.net-mvc-3 readonly editorfor

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

我尝试将readonly和disabled设为:

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

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

谢谢。

12 个答案:

答案 0 :(得分:85)

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" })

答案 1 :(得分:25)

MVC4以后版本支持此代码

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

答案 2 :(得分:12)

对于那些想知道为什么要使用EditoFor的人,如果你不想让它可以编辑,我就有一个例子。

我的模型中有这个。

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

当你想要显示那种格式时,它唯一的工作方式是使用EditorFor,但是我有一个jquery datepicker用于那个“输入”所以它必须是只读的,以避免用户写错错误的日期。 / p>

为了让它按照我想要的方式工作,我把它放在View ...

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

这是我准备好的功能......

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

我希望这对那里的人有所帮助。 对不起我的英文

答案 3 :(得分:6)

你可以这样做:

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

答案 4 :(得分: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 ReadOnly则添加EditorFor如果不是,请添加ValidateMessageFor并最终将Div中的所有内容包含在可以Html Attributes分配给Views的内容中......我的{{1}}非常干净。

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:3)

尝试使用:

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

答案 7 :(得分:1)

为特定的一组视图创建一个EditorTemplate(由一个Controller绑定): enter image description here

在此示例中,我有一个日期模板,但您可以将其更改为您想要的任何内容。

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

我使用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" } })
 }

答案 10 :(得分:-1)

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

更简单

例如:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }

答案 11 :(得分:-1)

<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

使用jquery禁用

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