我想使用EditorFor在編輯頁面進行readOnly。MVC3 EditorFor只有
我試圖把只讀和殘疾人爲:
<div class="editor-field">
@Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
</div>
但是,這是行不通的。我怎樣才能禁用編輯這個領域?
謝謝。
我想使用EditorFor在編輯頁面進行readOnly。MVC3 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,但你需要有一個TextBoxFor在自定義EditorTemplate:
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文檔中找到它:http://msdn.microsoft.com/en-us/library/ee834942(v=vs.100).aspx – JotaBe 2013-04-19 16:15:00
@JotaBe我認爲你是對的,但我以爲我之前看到過這些。也許是在MVC4預發行版中,或者我想象過的。無論哪種方式,我已經更新了答案。 – danludwig 2013-04-19 18:20:13
在較新版本的MVC(我相信4+?)中,'additionalViewData'對象可以具有'htmlAttributes'屬性,其'EditorFor'等用於html屬性。所以它會變成:'@ Html.EditorFor(model => model.userName,new {htmlAttributes = new {disabled =「disabled」,@readonly =「readonly」}})'。 – GSerg 2015-09-06 17:15:14
對於那些誰不知道你爲什麼要使用EditoFor如果我想知道我這是編輯,我有一個例子。
我在我的模型中有這個。
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0: dd/MM/yyyy}")]
public DateTime issueDate { get; set; }
,當你想顯示的格式,它的工作的唯一方法就是使用EditorFor,但我更喜歡的是「輸入」一個jQuery日期選擇器所以它必須是隻讀的,以避免書面方式下的用戶錯誤的日期。
爲了使它工作,我想我把這個視圖的方式......
@Html.EditorFor(m => m.issueDate, new{ @class="inp", @style="width:200px", @MaxLength = "200"})
,這在我準備功能...
$('#issueDate').prop('readOnly', true);
我希望這將是有益的爲那裏的人。 對不起,我的英語
謝謝Seichi!這是確切問題的真正解決方案! – 2015-02-09 14:50:38
這是一個很好的答案。它描述了原始問題的有效性,以及實際回答OP的內容。做得好! – Rob10e 2016-01-15 19:54:40
簡單直接的答案非常感謝你!要求讓我在檢查缺陷時來回跳動,我意識到我對editorfor的更改允許使用我期望的DisplayFormating,但是我發現它們不再被閱讀,只是這是一個很棒的發現! – ChristianProgrammer 2016-03-15 13:26:52
一組特定視圖(由一個控制器綁定)創建EditorTemplate:
在這個例子中,我有一個日期的模板,但你可以改變它,無論你想。
以下是數據中的代碼。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; }
你會如何編輯所有視圖? – Davor 2014-03-24 12:47:41
這裏是我如何做到這一點:
型號:
[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
超級乾淨。
我認爲這是比其它簡單通過使用[編輯(假)]特性
例如:
public class MyModel
{
[Editable(false)]
public string userName { get; set; }
}
添加[Editable(false)]似乎沒有做任何事情使控制只讀 – 2016-12-09 04:26:26
你也應該擴展InputTagHelper,正如我在我的答案在這裏解釋:https://stackoverflow.com/a/44639822/6339469 – HamedH 2017-06-19 20:59:16
<div class="editor-field">
@Html.EditorFor(model => model.userName)
</div>
使用jQuery禁用
<script type="text/javascript">
$(document).ready(function() {
$('#userName').attr('disabled', true);
});
</script>
此代碼支持MVC4以上版本
@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
關鍵更改是將html屬性包裝在「new {htmlAttributes =」<您所需的屬性>「}」字符串中。這似乎是EditorFor的獨特模式(與DisplayFor,DropdownFor等不同) – 2016-07-14 11:31:31
這應該是現在被接受的答案了 – 2016-12-09 03:33:16
我知道該問題時MVC 3,但它是2012年,所以以防萬一:
由於MVC 5.1的,你現在可以通過HTML屬性EditorFor
像這樣:
@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
嘗試使用:
@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
你可以這樣來做:
@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
我終於在MVC 4中找到了解決方案,謝謝! – ecasper 2017-01-25 14:39:34
舊後我知道..但現在你可以做到這一點,以保持對齊和所有尋求一致..
@Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
如果它是一個只讀的,那麼它不再是一個編輯器。它應該可能通過DisplayFor – 2012-04-11 15:34:26
使編輯器只讀一種破壞它的對象。爲什麼不使用DisplayFor? – ChrisBint 2012-04-11 15:34:58
可能的重複[如何設置在HTML文本框在asp.net-mvc禁用屬性?](http://stackoverflow.com/questions/3443460/how-do-i-set-disabled-attribute-on-html -textbox-in-asp-net-mvc) – 2012-04-11 15:40:05