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>