我正在尝试通过MVC模型将Form发布到控制器中的Save函数中。我也在客户端使用tinymce,这导致基于HTML代码的字符串,如<p> Content text blah blah ...</p>
。
问题是我无法发布包含<p> something </p>
的字符串但令人惊讶的是,< p > something < / p >
此字符串(在“&lt;”之后带有空格)没有问题。但是,我无法处理这个HTML代码并在每次发布之前创建这些空格。肯定有更好的办法。
那么,如何通过$ .post方法发布包含HTML代码的字符串? (如果你必须知道,这个项目是一个内容管理系统。所以,我必须将基于HTML的内容文本保存到SQL表中。)我通过调试看到,后期操作甚至达不到控制器,我认为这是一个唯一的JavaScript问题,我是对的吗?
这是我正在使用的代码:
的的Javascript
function JqueryFromPost(formId) { var form = $(formId); var action = form.attr("action"); var serializedForm = form.serializeArray(); $.post(action, serializedForm, function (data) { //Getting the data Result here... }); }
CS代码
[HttpPost] public JsonResult SaveArticle(ArticleModel model) { JsonResult JResult = new JsonResult(); if (ModelState.IsValid) //I do the saving here ending with "JResult.Data = "Success";" (this could also be Failed. So, its just to explain) return JResult; }
答案 0 :(得分:51)
ASP.NET具有内置请求验证功能,可自动帮助防止XSS和HTML注入攻击。如果您想明确禁用此验证,可以使用[ValidateInput(false)]
属性修饰您要发布到的操作:
[HttpPost]
[ValidateInput(false)]
public ActionResult SaveArticle(ArticleModel model)
{
var JResult = new JsonResult();
if (ModelState.IsValid)
{
...
}
return JResult;
}
此外,如果您在ASP.NET 4.0上运行此命令以使此属性生效,则需要将以下内容添加到您的web.config中:
<httpRuntime requestValidationMode="2.0" />
如果您使用的是ASP.NET MVC 3.0,则只能修饰模型中需要具有[AllowHtml]
属性的HTML的属性:
public class ArticleModel
{
[AllowHtml]
public string SomeProperty { get; set; }
public string SomeOtherProperty { get; set; }
}
同样在您的javascript函数中,您可能需要serialize()
而不是serializeArray()
:
function JqueryFromPost(formId) {
var form = $(formId);
$.post(form.action, form.serialize(), function (data) {
//Getting the data Result here...
});
}
答案 1 :(得分:3)
你不应该使用ValidateInput(false),因为MSN在这里说:http://msdn.microsoft.com/en-us/magazine/hh708755.aspx
只需在您想要的模型属性上使用[AllowHtml]
即可。
[AllowHtml]
public String htmlContainer { get; set; }
此外,我认为如果您编码html然后将其发布到服务器会更好。
答案 2 :(得分:1)
使用 [ValidateInput(false)] 是一种非常糟糕的做法,会导致许多安全漏洞, 模型属性上的 [AllowHtml] 是更安全可靠的方法。 但是如果你不能使用模型属性,那么有一个更清洁的解决方案。
只需编码客户端上的文字(mycase javascript ),解码服务端(控制器 > 功能)。 我将以下内容用于我的vb.net项目。
var SearchStringValue = <p> some blah...blah data </p>
现在编码上述变量。
var encodedSearchStringValue = window.escape(document.getElementById('SearchStringValue').value)
现在使用ajax将encodeSearchStringValue传递给控制器。
在控制器中只需解码变量即可获得<p> some blah...blah data </p>.
Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)
希望这会有所帮助......... :)。