c# - ¿Cómo permito que las etiquetas HTML se envíen en un cuadro de texto en asp.net?
javascript asp.net-mvc (5)
Primero, quiero que todos sepan que estoy usando un motor aspx, no un motor Razor.
Tengo una mesa dentro de un formulario. Uno de mis cuadros de texto contiene etiquetas html como
</br>Phone: </br> 814-888-9999 </br> Email: </br> [email protected].
Cuando voy a construirlo me da un error que dice
Se detectó un valor Request.Form potencialmente peligroso del cliente (QuestionAnswer="...ics Phone:<br/>814-888-9999<br...")
.
Probé la solicitud de validación = "false" pero no funcionó.
Lamento no haber agregado mi código html para que lo veas hasta ahora. Estoy haciendo algunas preguntas donde puedo editarlo, si es necesario.
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
EditFreqQuestionsUser
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<script type="text/javascript">
$(document).ready(function () {
$("#freqQuestionsUserUpdateButton").click(function () {
$("#updateFreqQuestionsUser").submit();
});
});
</script>
<h2>Edit Freq Questions User </h2>
<%Administrator.AdminProductionServices.FreqQuestionsUser freqQuestionsUser = ViewBag.freqQuestionsUser != null ? ViewBag.freqQuestionsUser : new Administrator.AdminProductionServices.FreqQuestionsUser(); %>
<%List<string> UserRoleList = Session["UserRoles"] != null ? (List<string>)Session["UserRoles"] : new List<string>(); %>
<form id="updateFreqQuestionsUser" action="<%=Url.Action("SaveFreqQuestionsUser","Prod")%>" method="post" onsubmit+>
<table>
<tr>
<td colspan="3" class="tableHeader">Freq Questions User Details <input type ="hidden" value="<%=freqQuestionsUser.freqQuestionsUserId%>" name="freqQuestionsUserId"/> </td>
</tr>
<tr>
<td colspan="2" class="label">Question Description:</td>
<td class="content">
<input type="text" maxlength="2000" name="QuestionDescription" value=" <%=freqQuestionsUser.questionDescription%>" />
</td>
</tr>
<tr>
<td colspan="2" class="label">QuestionAnswer:</td>
<td class="content">
<input type="text" maxlength="2000" name="QuestionAnswer" value="<%=freqQuestionsUser.questionAnswer%>" />
</td>
</tr>
<tr>
<td colspan="3" class="tableFooter">
<br />
<a id="freqQuestionsUserUpdateButton" href="#" class="regularButton">Save</a>
<a href="javascript:history.back()" class="regularButton">Cancel</a>
</td>
</tr>
</table>
</form>
</asp:Content>
Cliente JavaScript:
function codificarTags() {
document.getElementById(''txtDescripcion'').value = document.getElementById(''txtDescripcion'').value.replace(/</g,''<'').replace(/>/g,''>'');
};
<form id="form1" runat="server" onsubmit="codificarTags();">
Servidor:
protected void Page_Load(object sender, EventArgs e)
{
txtDescripcion.Text = txtDescripcion.Text.Replace(@"<", @"<").Replace(@">", @">");
Decora la acción de tu controlador con el atributo [ValidateInput]
:
[ValidateInput(false)]
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
...
}
El uso de html en el cuadro de texto no es una buena práctica, tal vez utilice linebreaks ( Environment.NewLine
) o / r / n en lugar de br
? Referencia .NET
Ejemplo (en C #):
textBox1.Multiline = true;
textBox1.Text = "test" + Environment.NewLine + "test2";
Yo sugeriría usar el Editor HTML de AjaxControlToolkit. Estoy implementando eso ahora. Si su cuadro de texto es de varias líneas y es lo suficientemente grande como para acomodar HTML, ¿por qué no hacerlo con un editor de HTML? Tu usuario también estará más feliz.
http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/HTMLEditor/HTMLEditor.aspx
antes de enviar la página, debe codificar en html el valor del cuadro de texto, con window.escape (...)
Si necesita el texto no escapado en el lado del servidor, use el HttpUtility.UrlDecode(...)
.
muestra muy rápida:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SO.WebForm1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script>
function makeSafe() {
document.getElementById(''TextBox1'').value = window.escape(document.getElementById(''TextBox1'').value);
};
function makeDangerous() {
document.getElementById(''TextBox1'').value = window.unescape(document.getElementById(''TextBox1'').value);
}
</script>
</head>
<body>
<form id="form1" runat="server" onsubmit="makeSafe();">
<div>
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" Rows="10" ClientIDMode="Static"></asp:TextBox>
</div>
<asp:Button ID="Button1" runat="server" Text="Button" />
</form>
<script>
makeDangerous();
</script>
</body>
</html>
Realice estos cambios en su código:
<script type="text/javascript">
$(document).ready(function () {
makeDangerous();
$("#freqQuestionsUserUpdateButton").click(function () {
makeSafe();
$("#updateFreqQuestionsUser").submit();
});
});
// Adding an ID attribute to the inputs you want to validate is simplest
// Better would be to use document.getElementsByTagName and filter the array on NAME
// or use a JQUERY select....
function makeSafe() {
document.getElementById(''QuestionAnswer'').value = window.escape(document.getElementById(''QuestionAnswer'').value);
};
// In this case adding the HTML back to a textbox should be ''safe''
// You should be very wary though when you use it as actual HTML
// You MUST take steps to ensure the HTML is safe.
function makeDangerous() {
document.getElementById(''QuestionAnswer'').value = window.unescape(document.getElementById(''QuestionAnswer'').value);
}
</script>