Jak mogę zezwolić użytkownikowi na wprowadzanie kodu HTML do określonego pola przy użyciu ASP.net MVC.
Mam długi formularz z wieloma polami, które są mapowane na ten złożony obiekt w kontrolerze.
Chciałbym, aby jedno pole (opis) zezwalało na HTML, na którym później wykonam własną higienę.
Odpowiedzi:
Dodaj następujący atrybut akcja (post) w kontrolerze, dla którego chcesz zezwolić na HTML:
Edycja: zgodnie z komentarzami Charlino :
W pliku web.config ustaw używany tryb sprawdzania poprawności. Zobacz MSDN :
Edycja września 2014: Zgodnie z komentarzami sprintera252 :
Powinieneś teraz użyć
[AllowHtml]
atrybutu. Zobacz poniżej z MSDN :źródło
<httpRuntime requestValidationMode="2.0" />
w pliku web.config.A co z
[AllowHtml]
atrybutem powyżej właściwości?źródło
MetadataTypeAttribute
i jest preferowane, ponieważ zezwala tylko na HTML w poszczególnych polach, a nie w całym obiekcie.Dodaj do modelu:
I do twojej własności
Ten kod z mojego punktu widzenia jest najlepszym sposobem uniknięcia tego błędu. Jeśli używasz edytora HTML, nie będziesz mieć problemów z bezpieczeństwem, ponieważ jest on już ograniczony.
źródło
Dodanie
[AllowHtml]
określonej właściwości jest zalecanym rozwiązaniem, ponieważ istnieje wiele blogów i komentarzy sugerujących obniżenie poziomu bezpieczeństwa, co powinno być niedopuszczalne.Dodając to, struktura MVC pozwoli na trafienie kontrolera i wykonanie kodu w tym kontrolerze.
Zależy to jednak od kodu, filtrów itp., W jaki sposób generowana jest odpowiedź i czy istnieje dalsza weryfikacja, która może wywołać inny podobny błąd.
W każdym razie dodanie
[AllowHtml]
atrybutu jest właściwą odpowiedzią, ponieważ pozwala na deserializację html w kontrolerze. Przykład w Twoim modelu widoku:źródło
Napotkałem ten sam problem, chociaż dodałem
[System.Web.Mvc.AllowHtml]
do dotyczącego właściwości, jak opisano w niektórych odpowiedziach.W moim przypadku mam
UnhandledExceptionFilter
klasę, która uzyskuje dostęp do obiektu Request przed przeprowadzeniem walidacji MVC (a zatem AllowHtml nie ma wpływu) i ten dostęp wywołuje[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
.Oznacza to, że dostęp do niektórych właściwości obiektu Request niejawnie wywołuje walidację (w moim przypadku jest to
Params
właściwość).Rozwiązanie zapobiegające sprawdzaniu poprawności jest udokumentowane w witrynie MSDN
Dlatego jeśli masz taki kod
zmień to na
lub po prostu użyj
Form
właściwości, która nie wydaje się uruchamiać walidacjiźródło
Jeśli chcesz zezwolić na wprowadzanie html dla parametru metody akcji (w przeciwieństwie do „właściwości modelu”), nie ma na to wbudowanego sposobu, ale możesz to łatwo osiągnąć za pomocą niestandardowego spinacza modelu:
Kod AllowHtmlBinder:
Znajdź pełny kod źródłowy i wyjaśnienie w moim poście na blogu: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
źródło
Kodowanie URL danych działa również dla mnie
Na przykład
var data = '<b> Witaj </b>'
W przeglądarce wywołaj encodeURIComponent (dane) przed wysłaniem
Na serwerze wywołaj HttpUtility.UrlDecode (received_data), aby zdekodować
W ten sposób możesz dokładnie kontrolować, który obszar pól może mieć kod HTML
źródło
Spotkałem się z tym problemem podczas tworzenia witryny e-commerce przy użyciu NopCommerce, otrzymałem to rozwiązanie na 3 różne sposoby, tak jak poprzednie odpowiedzi. Ale zgodnie ze strukturą NopCommerce nie znalazłem tych trzech na raz. Właśnie zobaczyłem, że właśnie tam używają
[AllowHtml]
i działa dobrze, z wyjątkiem każdego problemu. Jak poprzednio zadane pytanieOsobiście nie wolę,
[ValidateInput(false)]
ponieważ pomijam sprawdzanie całości modelu, co jest niebezpieczne. Ale jeśli ktoś tylko napisze , zajrzyj tutajwtedy po prostu pomija tylko jedną właściwość i zezwala tylko na określoną właściwość i nie sprawdza prawie wszystkich innych jednostek. Dlatego wydaje się lepszy od mojego.
źródło
W moim przypadku atrybut AllowHtml nie działał w połączeniu z filtrem akcji OutputCache. Ta odpowiedź rozwiązała problem za mnie. Mam nadzieję, że to komuś pomoże.
źródło
Możesz użyć
[AllowHtml]
do swojego projektu na przykładAby użyć tego kodu do biblioteki klas, należy zainstalować ten pakiet
Po użyciu tego
using
źródło
Żadna z odpowiedzi tutaj niestety nie zadziałała.
Skończyło się na tym, że użyłem niestandardowego powiązania modelu i użyłem zewnętrznego środka dezynfekującego.
Zobacz mój własny odpowiedział na pytanie tutaj .
źródło