2009-09-15 59 views
16

我有一個Html.TextBox(),我需要在某些條件下禁用它。使TextArea它是這樣的:asp.net MVC:禁用文本框

<%=primaryLang ? Html.TextArea("e.location", new { rows = 2, cols = 60 }) : Html.TextArea("e.location", new { rows = 2, cols = 60, disabled = "true" })%> 

但隨着文本框是不可能的:

<%=primaryLang ? 
     Html.TextBox("e.startDate") : 
     Html.TextBox("e.startDate", new { disabled = "true"})%> 

它將在價值問題{禁用=真}。這是因爲唯一允許你傳遞HtmlAttributes的函數也需要傳遞模型。這種觀點是強類型,並對模型進行自動填充

如果我通過這樣的:。

Html.TextBox("e.startDate", Model.e.startDate, new { disabled = "true"}) 

或像這樣:

Html.TextBox("e.startDate", null, new { disabled = "true"}) 

GET版本的工作,但POST版本將發佈NullReferenceException。上述兩者似乎具有完全相同的效果。兩者都將在GET上呈現來自模型的正確數據。

如果我離開它的慾望是這樣的:

Html.TextBox("e.startDate") 

它會正常工作,對於POST和GET ...

爲什麼?任何方式來完成?

謝謝! :)


多虧了下面的答案,我解決了這個問題是這樣的:

<%=primaryLang ? 
     Html.TextBox("e.startDate") : 
      Html.Hidden("e.startDate") + Html.TextBox("e.startDate", null, new { disabled = "true"})%> 

回答

16

殘疾人HTML元素不回發到服務器。這就是爲什麼當你設法禁用你的元素時你會得到一個NullReferenceException。

我不確定你要達到的目標,但是如果你不允許e.startDate是可編輯的,那麼你應該不需要將它發回來,因爲你應該已經知道它的價值。 所以你有兩個選擇。

  1. 按照原樣顯示e.startDate,但只需將post方法中的e.startDate值設置爲默認值即可完全忽略它。
  2. 如果您需要公佈的值,請將e.startDate顯示爲標籤,然後添加一個隱藏字段,其中包含e.startDate以顯示您的回傳值。

警告:僅僅因爲該元素被禁用,這並不意味着其他人無法編輯值,並張貼回來。這只是一個建議。這取決於瀏覽器如何顯示該字段。如果您的POST代碼確實接受了e.startDate值,那麼具有訪問權限的任何人都可以使用開發工具編輯該字段。

+0

就是這樣,太棒了!我解決了它,並用我的解決方法編輯了問題(在此處粘貼失去所有縮進並且無法讀取)。 – Palantir 2009-09-15 10:42:28

10

在POST, 「模型」 或 「E」 屬性可能是零。

你可以試試這個:

<%if (Model != null && Model.e != null) { %> 
<%=Html.TextBox("e.StartDate", Model.e.StartDate, primaryLang ? null : new { disabled = "disabled" })%> 
<%}%>