J'ai un textarea
dans mvc. Lorsque les données sont entrées et que je les affiche à nouveau à l'utilisateur, comment puis-je afficher les sauts de ligne?
J'affiche comme ceci:
<%= Model.Description%>
La classe suivante implémente un HtmlHelper qui code correctement le texte:
public static class HtmlExtensions
{
public static MvcHtmlString Nl2Br(this HtmlHelper htmlHelper, string text)
{
if (string.IsNullOrEmpty(text))
return MvcHtmlString.Create(text);
else
{
StringBuilder builder = new StringBuilder();
string[] lines = text.Split('\n');
for (int i = 0; i < lines.Length; i++)
{
if (i > 0)
builder.Append("<br/>\n");
builder.Append(HttpUtility.HtmlEncode(lines[i]));
}
return MvcHtmlString.Create(builder.ToString());
}
}
}
Il est facile d'utiliser dans vos vues:
<%= Html.Nl2Br(Model.MultilineText) %>
Ou avec rasoir:
@Html.Nl2Br(Model.MultilineText)
Pour une manière légèrement différente (et, à mon humble avis, meilleure et plus sûre) de résoudre le problème, voir cette réponse à une question similaire .
Au lieu de résoudre le problème de la conversion de tous les nouveaux caractères de la ligne en éléments <br>
, il suffit simplement d'appliquer le code CSS suivant à l'élément où vous affichez le texte saisi:
white-space: pre-line
Vous devez toujours encoder le texte saisi par l'utilisateur lors de sa réaffichage dans la vue pour vous assurer qu'il est sécurisé.
Vous pouvez faire comme Cybernate l’a suggéré ou l’ajouter à une méthode d’extension HtmlHelper
public static string EncodedMultiLineText(this HtmlHelper helper, string text) {
if (String.IsNullOrEmpty(text)) {
return String.Empty;
}
return Regex.Replace(helper.Encode(text), Environment.NewLine, "<br/>")
}
Pour qu'il puisse être facilement réutilisé dans votre vue
<%= Html.EncodedMultiLineText(Model.Description) %>
Essayez quelque chose comme ça:
<%=
Regex.Replace(
Html.Encode(Model.Description),
Environment.NewLine,
"<br/>",
RegexOptions.IgnoreCase||RegexOptions.Multiline
)
%>
La réponse ci-dessus qui fournit une extension d'assistance HTML statique fournit un constructeur obsolète:
return new MvcHtmlString(builder.ToString());
Cette ligne peut être remplacée par la ligne de code suivante:
return MvcHtmlString.Create((builder.ToString()));
Je pense que cette réponse résout les problèmes de façon agréable, en utilisant simplement css: style="white-space: pre-line"
, vérifiez également: CSS, espace blanc .
Pour Asp.net mvc razor, j’ai utilisé Html.Encode pour bloquer les attaques XSS.
@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
J'aime utiliser HtmlExtensions, Environment.NewLine et Regex, qui se trouvaient dans des réponses différentes. J'ai donc mis les réponses ci-dessus dans une seule méthode.
public static MvcHtmlString MultiLineText(this HtmlHelper htmlHelper, string text) {
if (string.IsNullOrEmpty(text)) {
return MvcHtmlString.Create(string.Empty);
}
return MvcHtmlString.Create(Regex.Replace(HttpUtility.HtmlEncode(text), Environment.NewLine, "<br/>"));
}
Utilisation
<%= Html.MultiLineText(Model.MultilineText) %>
Ou
@Html.MultiLineText(Model.MultilineText)
Peut-être que c'est la réponse: Comment gérez-vous les sauts de ligne dans la vue MVC HTML codée?
ou
tu peux essayer:
Model.Description.Replace(Environment.NewLine, "<br/>");
Cela fonctionne pour moi -
<% = HttpUtility.HtmlDecode (Html.ActionLink ("AOT <br /> numéro de demande", "nom action"))%>