Wyświetl ciąg jako html w widoku mvc asp.net

100

Mam kontroler, który generuje ciąg zawierający znaczniki html. Teraz, gdy wyświetlam go na widokach, jest wyświetlany jako prosty ciąg zawierający wszystkie tagi. Próbowałem użyć pomocnika HTML do kodowania / dekodowania, aby wyświetlić go poprawnie, ale nie działa.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

Z moich poglądów

@Html.Encode(str)
Mukesh Sharma
źródło
6
Chyba Html.Rawpowinienem pomóc.
Saeed Neamati
1
Myślę też, że możesz użyć HtmlStrinklasy, jak wHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Odpowiedzi:

172

Jesteś blisko, którego chcesz użyć @Html.Raw(str)

@Html.Encodepobiera ciągi znaków i zapewnia, że ​​wszystkie znaki specjalne są poprawnie obsługiwane. Należą do nich znaki takie jak spacje.

Jared
źródło
6
@ Html.Raw jest dokładnie tym, czego szukałem, dzięki za odpowiedź :)
AFract
IHtmlString, jak wspomniał @Jerad Rose, jest znacznie lepszy
Pratyush Dhanuka
38

Zamiast tego powinieneś użyć IHtmlString:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Kiedykolwiek masz właściwości modelu lub zmienne, które muszą przechowywać HTML, uważam, że jest to ogólnie lepsza praktyka. Przede wszystkim jest nieco czystszy. Na przykład:

@Html.Raw(str)

W porównaniu do:

@str

Uważam również, że jest to trochę bezpieczniejsze niż używanie @Html.Raw(), ponieważ obawa, czy dane są w formacie HTML, jest przechowywana w kontrolerze. W środowisku, w którym masz programistów front-end i back-end, twoi programiści zaplecza mogą być bardziej dostrojeni do tego, jakie dane mogą przechowywać wartości HTML, zachowując w ten sposób ten problem na zapleczu (kontrolerze).

Generalnie staram się unikać używania, Html.Raw()gdy tylko jest to możliwe.

Jeszcze jedna rzecz, na którą warto zwrócić uwagę, to to, że nie jestem pewien, gdzie przypisujesz str, ale kilka rzeczy, które dotyczą mnie, jak możesz to wdrażać.

Po pierwsze, należy to zrobić w kontrolerze, niezależnie od rozwiązania ( IHtmlStringlub Html.Raw). Uważasz, że powinieneś unikać takiej logiki, ponieważ tak naprawdę do niej nie należy.

Ponadto powinieneś używać swojego ViewModeldo pobierania wartości do widoku (i ponownie, najlepiej IHtmlStringjako typu właściwości). Widzenie czegoś takiego @Html.Encode(str)jest trochę niepokojące, chyba że robiłeś to tylko po to, aby uprościć swój przykład.

Jerad Rose
źródło
1
Chciałbym zaznaczyć, że kontrolery służą do routingu, a nie do przechowywania danych. Ponadto twoi deweloperzy zaplecza powinni wiedzieć lepiej niż kiedykolwiek, aby zmienić istniejący kontrakt kodu. Interfejs użytkownika powinien być powiązany z modelem, a jeśli model zmieni się drastycznie, testy jednostkowe powinny zostać przerwane.
Anthony Mason
Dzięki za odpowiedź. Lubię to.
Thomas.Benz
Tak, ta odpowiedź jest znacznie lepsza, początkowo użyłem Html.Raw, ale kiedy przeczytałem tę odpowiedź, od razu się przełączyłem
Pratyush Dhanuka
7

możesz użyć @Html.Raw(str)

Zobacz MSDN dla bardziej

Zwraca znaczniki, które nie są zakodowane w formacie HTML.

Ta metoda otacza znaczniki HTML przy użyciu klasy IHtmlString, która renderuje niezakodowany kod HTML.

AthibaN
źródło
1

Miałem podobny problem z polami wejściowymi HTML w MVC. Strona internetowa zawierała tylko pierwsze słowo kluczowe pola. Przykład: pole wejściowe: „Szybki rudy lis” Wyświetlana wartość: „The”

Rezolucja polegała na umieszczeniu zmiennej w cudzysłowie w zestawieniu wartości w następujący sposób:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Roland Wales
źródło
0

Miałem podobny problemNiedawno i wylądowałem tutaj w Google, więc umieściłem tę odpowiedź tutaj, na wypadek gdyby inni też tu wylądowali, dla kompletności.

Zauważyłem, że kiedy miałem źle sformatowany kod HTML , w rzeczywistości wszystkie tagi HTML zostały usunięte , a pozostała tylko zawartość bez tagów . W szczególności miałem tabelę z brakującym otwierającym tagiem tabeli, a następnie wszystkie moje tagi HTML z całego ciągu zostały całkowicie wyrwane.

Więc jeśli powyższe nie działa, a ty nadal drapiesz się po głowie, sprawdź także html jest poprawny.

Zauważyłem, że nawet po uruchomieniu MVC dodawał tbody tbody tam, gdzie ich nie miałem. To mówi mi, że trwa czyszczenie (MVC 5), a jeśli nie może się to zdarzyć, usuwa wszystkie / niektóre tagi.

Greg
źródło