Jedną z opcji jest tworzenie niestandardowej wersji pliku Html.DropDownList, która pobiera dodatkowy parametr i robi to, co chcesz ... ale wtedy musisz utworzyć nowy dla każdego typu helpera: TextBoxFor, TextAreaFor, CheckBoxFor, etc ... i nadal musisz wymyślić, jak sprawić, by jego wnętrzności działały.
Zamiast tego zdecydowałem się stworzyć pomocnika HTML, który zastąpi normalny anonimowy obiekt HtmlAttributes, ponieważ wtedy będzie kompatybilny z wszystkimi Pomocnikami, którzy używają HtmlAttributes bez żadnej specjalnej pracy. To rozwiązanie pozwala również przejść przez dodatkowe Atrybuty, takie jak Klasa, Nazwa lub cokolwiek chcesz. Nie blokuje cię tylko do wyłączenia.
Utworzono następujący pomocnik - pobiera obiekt logiczny i anonimowy. Jeśli wyłączona jest prawdą, dodaje atrybut disabled do anonimowego obiektu (który jest w rzeczywistości Słownikiem) z wartością "disabled", w przeciwnym razie nie doda w ogóle właściwości.
public static RouteValueDictionary ConditionalDisable(
bool disabled,
object htmlAttributes = null)
{
var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (disabled)
dictionary.Add("disabled", "disabled");
return dictionary;
}
Przykładem go w akcji:
@Html.TextBoxFor(m => m.SomeProperty,
HtmlHelpers.ConditionalDisable(true, new { @class = "someClass"))
Jeden Ogromną zaletą tego podejścia dla mnie było to, że współpracuje z praktycznie wszystkich MVC HtmlHelpers ponieważ wszystko mają przeciążenia, które akceptują RouteValueDictionary zamiast anonimowego obiektu.
Ostrzeżenia:
HtmlHelper.AnonymousObjectToHtmlAttributes() używa wymyślnej pracy Kod ninja, aby to zrobić. Nie jestem do końca pewny, jak jest to wykonawca ... ale to wystarczyło dla tego, do czego go używam. Twój przebieg może się różnić.
Nie podoba mi się szczególnie nazwa - ale nie mogłem wymyślić nic lepszego. Zmiana nazwy jest łatwa.
Nie lubię też składni użycia - ale znowu nie mogłem wymyślić nic lepszego. Zmiana nie powinna być trudna. Metoda rozszerzenia na object
to jeden z pomysłów ... skończyłoby się z new { @class = "someClass" }.ConditionalDisable(true)
, ale jeśli chcesz tylko wyłączyć atrybut i nie masz nic dodatkowego do dodania, skończysz z czymś brutto, takim jak new {}.ConditionalDisable(true);
, a także skończysz z metoda rozszerzenia, która pojawia się dla wszystkich obiektów ... co prawdopodobnie nie jest pożądane.
Cześć, chcę wyłączyć/włączyć rozwijaną dla konkretnych stron wyłącznie na podstawie wartości, ja przepuszczenie go przez model. Próbowałem przekazać true/false osobom niepełnosprawnym, ale to nie działa. Możesz pomóc w tym – ravithejag