2012-04-11 61 views
56

我想使用EditorFor在編輯頁面進行readOnly。MVC3 EditorFor只有

我試圖把只讀和殘疾人爲:

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

但是,這是行不通的。我怎樣才能禁用編輯這個領域?

謝謝。

+5

如果它是一個只讀的,那麼它不再是一個編輯器。它應該可能通過DisplayFor – 2012-04-11 15:34:26

+4

使編輯器只讀一種破壞它的對象。爲什麼不使用DisplayFor? – ChrisBint 2012-04-11 15:34:58

+2

可能的重複[如何設置在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

回答

73

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

我找不到允許指定參數的重載。我錯過了另一種擴展方法嗎?找不到它與Intellisense,都沒有在MSDN文檔中找到它:http://msdn.microsoft.com/en-us/library/ee834942(v=vs.100).aspx – JotaBe 2013-04-19 16:15:00

+0

@JotaBe我認爲你是對的,但我以爲我之前看到過這些。也許是在MVC4預發行版中,或者我想象過的。無論哪種方式,我已經更新了答案。 – danludwig 2013-04-19 18:20:13

+1

在較新版本的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

12

對於那些誰不知道你爲什麼要使用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); 

我希望這將是有益的爲那裏的人。 對不起,我的英語

+0

謝謝Seichi!這是確切問題的真正解決方案! – 2015-02-09 14:50:38

+0

這是一個很好的答案。它描述了原始問題的有效性,以及實際回答OP的內容。做得好! – Rob10e 2016-01-15 19:54:40

+0

簡單直接的答案非常感謝你!要求讓我在檢查缺陷時來回跳動,我意識到我對editorfor的更改允許使用我期望的DisplayFormating,但是我發現它們不再被閱讀,只是這是一個很棒的發現! – ChristianProgrammer 2016-03-15 13:26:52

1

一組特定視圖(由一個控制器綁定)創建EditorTemplate: enter image description here

在這個例子中,我有一個日期的模板,但你可以改變它,無論你想。

以下是數據中的代碼。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; } 
+0

你會如何編輯所有視圖? – Davor 2014-03-24 12:47:41

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如果屬性ReadOnlyEditorFor如果不是,加上一個ValidateMessageFor,最後把所有這些都包含在Div之內,它可以有Html Attributes分配給它...我的Views超級乾淨。

-1

我認爲這是比其它簡單通過使用[編輯(假)]特性

例如:

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

添加[Editable(false)]似乎沒有做任何事情使控制只讀 – 2016-12-09 04:26:26

+0

你也應該擴展InputTagHelper,正如我在我的答案在這裏解釋:https://stackoverflow.com/a/44639822/6339469 – HamedH 2017-06-19 20:59:16

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

使用jQuery禁用

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

此代碼支持MVC4以上版本

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

關鍵更改是將html屬性包裝在「new {htmlAttributes =」<您所需的屬性>「}」字符串中。這似乎是EditorFor的獨特模式(與DisplayFor,DropdownFor等不同) – 2016-07-14 11:31:31

+1

這應該是現在被接受的答案了 – 2016-12-09 03:33:16

3

我知道該問題時MVC 3,但它是2012年,所以以防萬一:

由於MVC 5.1的,你現在可以通過HTML屬性EditorFor像這樣:

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

嘗試使用:

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

你可以這樣來做:

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

我終於在MVC 4中找到了解決方案,謝謝! – ecasper 2017-01-25 14:39:34

1

舊後我知道..但現在你可以做到這一點,以保持對齊和所有尋求一致..

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