我正在使用AJAX将div
的内容发布到我的C#mvc-controller。
AJAX帖子看起来像这样:
$.ajax({
url: '/Home/SaveContent',
type: 'POST',
data: {
model: modelDataJson,
activeId: activeId,
contentToUpdate: $("div#" + activeId).html()
},
dataType: 'json',
success: function (data) {
alert("Content hits controller. Id: " + activeId);
},
error: function () {
alert("error");
}
});
我正在使用一个WYSIWYG编辑器,它是一个id为activeId
的div。
所以我想发布的是这一行:contentToUpdate: $("div#" + activeId).html()
以下是这个div:
<div id="WelcomeText" data-photo="15" class="click2edit" style="display: block;">
som content here
</div>
如果我在上面发布这个,我的c#-controller-method会被点击,一切正常。
但如果我在下面发布,error: function () { alert("error");}
会被点击:
<div id="WelcomeText" data-photo="15" class="click2edit" style="display: block;">
<p>som content here</p>
</div>
所以我的问题是:为什么包含HTML时帖子不起作用?我错过了什么,似乎contentToUpdate: $("div#" + activeId).html()
不包括子元素?
答案 0 :(得分:2)
默认情况下,MVC会在绑定模型时拒绝包含HTML的已发布值,因为它可能存在危险。在您的第一篇文章中,值为
som content here
但是在第二个
<p>som content here</p>
第二个被检测为HTML并被拒绝。
要允许HTML内容,您可以将[AllowHtml]
属性添加到模型中的相关属性。
例如:
public class MyModel
{
[AllowHtml]
public string HtmlContent { get; set; }
}
有关AllowHtml
属性的更多信息,请访问MSDN。
修改强>
根据评论中的以下内容:
我的控制器后期方法看起来像
public void SaveContent(string model, string activeId, string contentToUpdate){}
如果是这种情况,则上述情况不起作用,因为您没有可应用[AllowHtml]
属性的模型。
您有几个选择: 首先,您可以创建一个模型并将属性添加到该模型然后更改您的操作方法以采用新模型:
public class SomeModel
{
public string Model {get; set;}
public string ActiveId {get; set;}
[AllowHtml]
public string ContentToUpdate {get; set;}
}
public void SaveContent(SomeModel model)
{
//access model.Model, model.ActiveId and model.ContentToUpdate here
}
或者,您可以按原样保留操作方法,并使用[ValidateInput(false)]
属性修饰操作方法:
[ValidateInput(false)]
public void SaveContent(string model, string activeId, string contentToUpdate)
{
//do stuff here
}
这会阻止对发送到该操作方法的所有参数进行验证,因此您应自行验证model
和activeId
。