0

次のように、管理者の html エディターからサーバー コントローラーにマークアップを投稿しています。

        var dataString = 'id=' + id +
                         '&name=' + name +
                         '&nameEngl=' + nameEngl +
                         '&description=' + description +
                         '&descriptionEngl=' + descriptionEngl +
                         '&imageName=' + imageName +
                         '&previewImageName=' + previewImageName +
                         '&types=' + types +
                         '&bottomAreaHtml=' + bottomAreaHtml +
                         '&bottomAreaHtmlEngl=' + bottomAreaHtmlEngl +
                         '&slug=' + slug +
                         '&__RequestVerificationToken=' + encodeURIComponent($("input[name=__RequestVerificationToken]").val());

        $.ajax({
            type: "POST",
            url: $("#EditProjectActionUrl").val(),
            data: dataString,
            success: function (result) {
                RefreshProjectsList();
                form.find("#divStatus-p").hide();
                form.closest('.modal-popup').dialog('close');
            }
        });

ご覧のとおりdataString、マークアップを含む大きな文字列がありますが、ブラウザ リクエスト テレメトリを介して、サーバーに正しく送信されていることがわかります。

サーバー上で、コントローラーのアクションを介して投稿されたデータを受信して​​います:

    [Authorize]
    [ValidateAntiForgeryToken]
    [ValidateInput(false)] 
    [HttpPost]
    public ActionResult EditProject(string id, string name, string nameEngl, string description, string descriptionEngl, string customCSS, string imageName, string previewImageName, string types, string bottomAreaHtml, string bottomAreaHtmlEngl, string slug)
    {

メソッド呼び出しの時点で、デフォルトのバインダーがすべてのパラメーターを設定します。bottomAreaHtmlパラメーターにクリップされた (完全ではない) マークアップ文字列が含まれる問題。ここで何が問題なのですか?

4

3 に答える 3

1

ここでは別のアプローチを提案します。アクションに非常に多くの引数を持たせる代わりに、EditProjectそれらの引数に一致するプロパティを持つオブジェクトを作成してください。例:

public class ProjectSettings
{
    public string id { get; set; }
    public string name { get; set; } 
    public string nameEngl{ get; set; } 
    public string description{ get; set; } 
    public string descriptionEngl{ get; set; } 
    public string customCSS{ get; set; } 
    public string imageName{ get; set; } 
    public string previewImageName{ get; set; } 
    public string types{ get; set; } 
    public string bottomAreaHtml{ get; set; } 
    public string bottomAreaHtmlEngl{ get; set; } 
    public string slug{ get; set; } 
}

次に、オブジェクト自体をアクションに渡すだけで、モデル バインダーが面倒な作業を行います。

[Authorize]
[ValidateAntiForgeryToken]
[ValidateInput(false)] 
[HttpPost]
public ActionResult EditProject(ProjectSettings projectSettings)
{
    //...
}

JavaScript でオブジェクトを使用することもできます。

    var settings = {
        'id': id,
        'name': name,
        'nameEngl': nameEngl,
        'description': description,
        'descriptionEngl': descriptionEngl,
        'imageName': imageName,
        'previewImageName': previewImageName,
        'types': types,
        'bottomAreaHtml': bottomAreaHtml,
        'bottomAreaHtmlEngl': bottomAreaHtmlEngl,
        'slug': slug
    };

    $.ajax({
        type: "POST",
        url: $("#EditProjectActionUrl").val(),
        data: { projectSettings: settings, '__RequestVerificationToken': encodeURIComponent($("input[name=__RequestVerificationToken]").val()) },
        contentType: 'application/json, charset=utf-8',
        success: function (result) {
            RefreshProjectsList();
            form.find("#divStatus-p").hide();
            form.closest('.modal-popup').dialog('close');
        }
    });

率直に言って、偽造防止トークンがどのようにそこに入る必要があるかについてはよくわかりませんが、あなたはその考えを理解していると思います. この方法では、JavaScript や文字列の連結と戦っていません。

幸運を。

于 2012-09-20T22:38:09.507 に答える
0

bottomAreaHtml に「&」文字が含まれていないことを確認する必要があります。その場合、エスケープしないと、モデル バインダーが「混乱」します。これは、クエリ文字列値の区切り文字であるためです。

于 2012-09-20T21:37:24.370 に答える
0

データをクエリ文字列形式にエンコードする代わりに、javascript オブジェクトをデータ パラメータとして使用すると、データは連結されず、通常はサーバーに配信されます。

于 2012-09-20T15:44:39.547 に答える