【问题标题】:AJAX "post" Issue when posting html-elements发布 html 元素时的 AJAX“发布”问题
【发布时间】:2014-10-28 11:20:08
【问题描述】:

我正在使用 AJAX 将 div 的内容发布到我的 C# mvc 控制器。 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");
    }
});

我正在使用一个所见即所得的编辑器,它是一个带有 id 的 div:activeId。 所以我要发布的是这一行: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() 不包括子元素?

【问题讨论】:

  • ASP.NET 曾经有一个反 XSS 过滤器,可以阻止包含看起来像 HTML 的内容的请求。你不会遇到这样的事情吧?

标签: c# html ajax


【解决方案1】:

默认情况下,MVC 在绑定模型时会拒绝包含 HTML 的发布值,因为它具有潜在危险。在您的第一篇文章中,价值是

som content here

但在第二个是

<p>som content here</p>

第二个被检测为 HTML 并被拒绝。

要允许 HTML 内容,您可以将 [AllowHtml] 属性添加到模型中的相关属性。

例如:

public class MyModel
{
    [AllowHtml]
    public string HtmlContent { get; set; }
}

有关AllowHtml 属性的更多信息,请访问MSDN

编辑

基于来自 cmets 的以下内容:

我的控制器后处理方法看起来像这样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
}

这将阻止对发送到该操作方法的所有参数进行验证,因此您应该自己验证modelactiveId

【讨论】:

  • 感谢您的回答。我试图在我的财产上 [AllowHtml],但后来我的 saveFile 按钮女巫触发了 ajax 停止工作。可能是什么问题?
  • @user3228992 - 您使用的是哪个版本的 MVC?另外,您是否接受控制器方法上的 FormCollection?
  • 我正在使用 MVC“5.1”。为什么我需要 FormCollection?我的控制器后处理方法看起来像这样public void SaveContent(string model, string activeId, string contentToUpdate){}。谢谢
  • @user3228992 - 查看我的更新。关于 FormCollection 的问题是一个猜测,因为如果您的方法类似于 public void SaveContent(FormCollection values){}AllowHtml 属性将不起作用。你不需要使用FormCollection(我认为你也不应该应该)。
  • 感谢您的回答!我尝试了快速的[ValidateInput(false)] 解决方案,效果很好!我也会考虑你的其他解决方案!
猜你喜欢
  • 2013-01-10
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2014-05-14
相关资源
最近更新 更多