2009-09-15 17 views
16

Mam Html.TextBox() i muszę go wyłączyć w pewnych warunkach. Z TextArea to idzie tak:asp.net MVC: wyłącza TextBox

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

Ale z TextBox nie jest możliwe:

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

będzie wydać {disabled = true} wartości. Jest tak dlatego, że jedyną funkcją, która pozwoli ci przekazać HtmlAttributes będzie również wymagać przekazania modelu. Pogląd ten jest silnie wpisane, a model jest automatycznie wypełniane

Gdybym przekazać go tak:.

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

lub tak:

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

wersja GET będzie działać, ale wersja POST wyda wyjątek NullReferenceException. Oba powyższe wydają się mieć dokładnie taki sam efekt. Obie przedstawią poprawne dane z modelu w GET.

Jeśli zostawię go pożąda tak:

Html.TextBox("e.startDate") 

będzie działać poprawnie, zarówno POST i GET ...

Dlaczego? Jakieś sposoby osiągnięcia?

Dzięki! :)


Dzięki odpowiedzi poniżej Rozwiązałem to tak:

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

Odpowiedz

16

elementy HTML niepełnosprawnych nie zakładać z powrotem na serwer. To dlatego otrzymujesz wyjątek NullReferenceException, gdy zdołasz wyłączyć swój element.

Nie jestem pewien, co próbujesz osiągnąć, ale jeśli nie zgadzasz się na edycję e.startDate, nie powinieneś potrzebować jej odesłania, ponieważ powinieneś już znać wartość. Masz dwie opcje.

  1. Wyświetl e.startDate tak, jak było, ale po prostu ustaw wartość e.startDate w metodzie post na domyślną lub zignoruj ​​ją całkowicie.
  2. Jeśli potrzebujesz opublikowanej wartości, wyświetl e.startDate jako etykietę, a następnie dodaj ukryte pole z wartością e.startDate do przesłania wartości.

Warning: Tylko dlatego, że element jest wyłączony to nie znaczy, że ktoś nie może zmieniać wartości i umieścić go z powrotem. To tylko zalecenie. Od przeglądarki zależy, jak wyświetlić pole. Jeśli twój kod POST akceptuje wartość e.startDate, to każdy, kto ma dostęp, może edytować to pole przy użyciu narzędzi programistycznych.

+0

To wszystko, świetnie! Rozwiązałem go i zredagowałem pytanie za pomocą mojego obejścia (wklejenie go tutaj traci wszystkie wcięcia i jest nieczytelne). – Palantir

10

na stanowisku, "Model" i "e" własność jest prawdopodobnie zerowa.

Można spróbować to:

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