MVC3编辑器仅供只读


68

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

我试图把只读和禁用为:

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

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

谢谢。


7
如果它是只读的,则它不再是编辑器。它可能应该由DisplayFor

5
使编辑器变为只读会破坏其目的。为什么不只使用DisplayFor?
ChrisBint 2012年


2
可能希望使用用户EditorFor(但被禁用)的原因是外观,这是我的原因。DisplayFor会创建一个不带框的文本输出,必须对其进行CSS调整以使其正确地排列在表单上(这并不困难,只是一些填充顶部)。但是,您可能希望有一个表格,其中所有字段都在框中,ReadOnly值显示为灰色。
格雷格·特雷尔

Answers:


92

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

我找不到允许指定参数的重载。我还错过了另一种扩展方法吗?无法使用Intellisense找到它,也无法在msdn文档中找到它:msdn.microsoft.com/en-us/library/ee834942
v=vs.100).aspx

@JotaBe我认为你是对的,但我想我以前看过这些。也许是在MVC4的预发行版中,或者也许是我想象中的。无论哪种方式,我都更新了答案。
danludwig

4
在MVC的新版本(我相信4+?)的additionalViewData对象可以有htmlAttributes属性,该属性EditorFor等中使用的HTML属性。因此它将变为:@Html.EditorFor(model => model.userName, new { htmlAttributes = new { disabled = "disabled", @readonly = "readonly" } })
GSerg 2015年

32

MVC4及更高版本支持此代码

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

1
关键更改是将html属性包装在“新{htmlAttributes =“ <您希望的属性>”}“字符串中。这似乎是EditorFor的独特模式(与DisplayFor,DropdownFor等不同)
Greg Terrell

我同意Matthew Lock
GSoft Consulting

1
值得一提的是,disabled元素不会传递到Controller中。如果您想通过它,请使用readonly
Duck Ling

13

对于那些想知道为什么如果您不希望EditoFor是可编辑的,为什么要使用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);

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


谢谢清一 这是确切问题的真正解决方案!
伊沃·斯托亚诺夫

这是一个很好的答案。它描述了原始问题是什么有效,以及实际回答了OP。很好!
Rob10e

简单直截了当的回答非常感谢!需求使我在审查缺陷时来回跳动,我意识到我对editorfor的更改允许我想要的DisplayFormating,但是我发现他们不再阅读,这是一个很棒的发现!
ChristianProgrammer

6

您可以这样进行:

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

1
我终于在MVC 4中找到了解决方案,谢谢!
ecasper

4

我知道这个问题指出了MVC 3,但那是2012年,所以以防万一:

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

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

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不是,则添加a,添加a ValidateMessageFor,最后将所有这些包装在Div可以Html Attributes分配的a中对此...我Views超级干净。



1

为一组特定的视图创建一个EditorTemplate(由一个Controller绑定): 在此处输入图片说明

在此示例中,我有一个日期模板,但您可以将其更改为所需的任何样式。

这是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; }

1

我知道以前的帖子..但是现在您可以执行此操作以保持对齐并看起来一致。

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

1

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

注意readonly即使设置为false,任何readonly属性的存在都会使该字段成为现实,因此为什么我将编辑器分支为如下代码。

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

感谢您格式化Litisqe Kumar-我忘了怎么做。
约翰·布莱尔

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

使用jQuery禁用

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

-1

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

例如:

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

添加[Editable(false)]似乎并没有做任何事情使控件变为只读
Matthew Lock

您还应该扩展InputTagHelper,如我在此处的答案中所述:stackoverflow.com/a/44639822/6339469
HamedH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.