2010-02-11 16 views
25

Mam RequiredFieldValidator z Display="Dynamic" na moim ASP.NET WebForm. Przydzieliłem mu klasę przy użyciu właściwości CssClass. Chcę, aby komunikat o błędzie był wyświetlany przy użyciu display: block, więc umieściłem to na klasie css w moim arkuszu stylów.RequiredFieldValidator wyświetla miejsca: wstawia tekst

Niestety, walidator umieszcza ekran: wstawiany na elemencie na stronie internetowej, który skutecznie nadpisuje wartość mojego arkusza stylów.

Czy mogę się tego pozbyć?

Edit:

Właśnie uświadomiłem sobie, dlaczego to nie działa. Ustawienie wartości Display="Dynamic" w walidatorze powoduje, że podczas renderowania ustawia on style="display: none" na znaczniku span. Biblioteka .NET javascript następnie przełącza styl inline elementu między none i inline. Po prostu działa weryfikator dynamiczny. Aby wyświetlić element blokowy, należy zmodyfikować sposób sprawdzania poprawności zdarzenia po stronie klienta. czy jest to możliwe do zrobienia?

Odpowiedz

3
+0

To nie działa. To po prostu powoduje, że walidator jest wyświetlany, gdy strona ładuje się (co nie jest tym, czego chcę). Kiedy próbuję sumbit, zmienia styl z powrotem na "inline" (jeśli sprawdzanie poprawności nie powiedzie się). Zobacz mój zredagowany post z tego powodu. – Pete

+1

OK, nie zwracałam zbytniej uwagi! Zaktualizowałem swój post, może to pomoże! –

+0

Hej. Dziękuję za aktualizację. To nie jest najładniejsze rozwiązanie, ponieważ wpływa globalnie na wszystkie walidatory i zależy od rzeczy, które są szczegółami implementacji platformy .NET. Ale działa (daje pożądany rezultat). Chociaż ładniejszym rozwiązaniem może być zmiana pomiędzy przełączaniem klas CSS. W ten sposób masz przynajmniej możliwość decydowania o pr. podstawa walidatora, jeśli powinna być blokowa lub wbudowana. – Pete

29

Niezwykle hacky rozwiązanie ja kiedyś (czego nie jestem dumny, ale to działało) był zawinąć RequiredFieldValidator w <div>, która jest elementem blokowym; dlatego też, mimo że RequiredFieldValidator jest wbudowany, znajduje się wewnątrz bloku div, więc w większości przypadków będzie skutecznie wyświetlany jako display: block.

Powiedziałem, że to było hacky!

+15

Nie jestem pewien, dlaczego nazywasz swoje rozwiązanie "hacky". To nie jest hacky, to jest PRAWA droga, jak to zrobić. Czym jest "hacky" to idiotyczne rozwiązanie z webresource.axd w zaakceptowanej odpowiedzi. – realPro

+3

Zawijanie walidatorów w "div" da ci tylko "efekt nowej linii", który otrzymasz z elementów na poziomie bloku. Upewnij się, że masz weryfikator z tekstem, który obejmuje kilka linii, nadaj mu kolor tła, a zobaczysz, co mam na myśli. Prawdziwe elementy na poziomie bloku mają pewne właściwości, których nie można replikować poprzez zawijanie elementów wbudowanych w blok. –

+2

mój rodzaj poprawki! proste i skuteczne. – jplara

1

Już miałem wypróbować rozwiązanie css, ale po przeczytaniu tego, co napisałeś (zaktualizowałeś), myślę, że mogę trzymać się mojego. Musiałem już skonfigurować mój weryfikator na serwerze z innych powodów, więc po prostu sprawdzam typ kontrolny "controlToValidate", a następnie dla formantów typu textbox dodam znacznik <br /> na początku wiadomości.

np.
// Inline (if configured)
myvalidator.Text = "<br />My message";

// Normal message and validation summary (if configured)
myvalidator.ErrorMessage = "My Message";

To utrzymuje podział wiersza z renderowania w podsumowaniu walidacji, wciąż patrząc w prawo na moje wiadomości inline.

Uważam, że podejście Blackomen jest również dobre, ale musi być również selektywnie stosowane.

0

Istnieje proste rozwiązanie, które będzie działać teraz i w przyszłości.

1) Dodać klasę do weryfikatora
2) zastosowanie jquery dodać element wewnętrzny do zakresu weryfikatorów lub użyć JavaScript

function wrapValidators() { 

    $('.input-error').wrapInner('<span class="block" />'); 
} 

3) dodać css do klasy 'blok' „display: blok "

2

Znalazłem rozwiązanie, które działa przez przesłonięcie.Netto metoda ValidatorUpdateDisplay() w JavaScript, i należy umieścić przed zamykającym tagiem.

<script type="text/javascript"> 
    function ValidatorUpdateDisplay(val) 
    { 
     if (typeof (val.display) == "string") 
     { 
      if (val.display == "None") 
      { 
       return; 
      } 
      if (val.display == "Dynamic") 
      { 
       val.style.display = val.isvalid ? "none" : "block"; 
       return; 
      } 
     } 
     if ((navigator.userAgent.indexOf("Mac") > -1) && (navigator.userAgent.indexOf("MSIE") > -1)) 
     { 
      val.style.display = "inline"; 
     } 
     val.style.visibility = val.isvalid ? "hidden" : "visible"; 
    } 
</script> 
+0

IMO, to najlepsze rozwiązanie. – raydowe

30

Używanie selektora atrybutów CSS i! Ważne, że to zrobiłem. Musiałem użyć selektora "zawiera", aby działał w FF, ale teraz przetestowałem go w IE10, FF i Chrome i jak na razie działa. To naprawdę proste. Oto próbka walidator w mojej strony aspx:

<asp:RequiredFieldValidator runat="server" ID="rfvRequired" ErrorMessage="This is required.<br/>This is line 2" ControlToValidate="tbRequired" ValidationGroup="CommonAttributesValidationGroup" SetFocusOnError="True" CssClass="valerror" Display="Dynamic"></asp:RequiredFieldValidator> 

Następny mam styl valerror.

span.valerror[style*="inline"] 
{ 
    display:block !important; 
    background-color: Yellow; 
    border: 1px solid #cccccc; 
    font-size:.9em; 
} 

To wszystko. Jak to działa: kiedy rozpiętość zmienia styl z "display: none" na "display: inline" selektor atrybutu na kopnięciach zakresu i wymusza blok. Wystarczy, że wprowadzisz JEDNĄ pozycję CSS podobną do tej powyżej i upewnij się, że robisz każdy walidator tej klasy.

+1

Podoba mi się to rozwiązanie. Nie zanieczyszcza mojego znacznika, skryptu lub kodu, a to * działa po prostu *. Starsze przeglądarki mogą bez tego żyć - przynajmniej w moim przypadku. –

+0

Dzięki dodanej div i oddzielnej stylizacji jest teraz kompatybilny ze starszymi przeglądarkami. – David

+0

To zadziałało dla mnie, szukałem dokładnie tego samego numeru –

1

Jedną z opcji jest unosić element, aby akt elementem „bardziej przypomina bloku”.

HTML

<div class="form-group clearfix"> 
    <asp:CustomValidator runat="server" Display="Dynamic" CssClass="help-block" /> 
</div> 

CSS

span.help-block { 
    float: left; 
    width: 100%; 
} 
Powiązane problemy