3

単純なフォームを使用して、許可されたユーザーが、構築しているMVC3Razorサイトの選択したページのコンテンツを変更できるようにしようとしています。編集フォームを正しく投稿できません。

私のモデルは次のとおりです。

public class WebContent
{
    public virtual UInt32 id { get; set; }
    public virtual String page { get; set; }
    public virtual String section { get; set; }

    [UIHint("tinymce_jquery_full"), AllowHtml]
    public virtual String content { get; set; }
}

私のコントローラー:

    [Authorize]
    public ActionResult Edit(String page, String section)
    {
        WebContent content = _WebContent.GetSection(page,section);
        return View(content);
    }

    [Authorize]
    [HttpPost]
    public ActionResult Edit(WebContent content)
    {
        if (ModelState.IsValid)
        {
            _WebContent.Update(content);
            return View("Index");
        }
        else return View("Index");
    }

そして私の見解:

@model SongbirdsStudios.Models.WebContent
@{
  ViewBag.Title = "Edit '"+Model.page+"'Page Content";
}

<div>
<h2>Edit</h2>
@using (Html.BeginForm())
{

    <fieldset>
        <legend>Page Content</legend>
        @Html.HiddenFor(m => m.id)
        @Html.HiddenFor(m => m.page)
        @Html.HiddenFor(m => m.section)
        <div class="editor-label">
            Content
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.content)
        </div>
        <p>
            <input type="submit" value="Update" />
        </p>
    </fieldset>
}
</div>

ビューは正しくレンダリングされ、期待される要素が表示されます。UIHint( "tinymce_jquery_full")が正しく取得され、TinyMCEエディターがページに表示されます。ただし、フォームを送信すると、例外が発生します。

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (content=...)

私が読んだすべてのことは、AllowHTML属性がこれを投稿できるようにする必要があることを示していますが、それは何らかの理由ではありません。

[ValidateInput(false)]属性をHttpPostコントローラーメソッドに追加することで、これを回避できます。そうすると、この例外は発生しませんが、モデルはコントローラーに渡されません。代わりにnullを渡すだけです。デバッガーでHttpContextを調べると、モデルクラスをコントローラーに戻す代わりに、モデルのプロパティごとに1つずつ、合計4つの個別の値が渡されていることがわかります。これを正しく機能させるために何を変更する必要があるのか​​わかりません。

私はそれが私が見逃した単純なものであり、より良い目を持つ誰かがそれが何であるかを見ることができることを望んでいます。

4

3 に答える 3

3

そのため、ASP MVCがフォームフィールドをモデルクラスにマップする方法をさらに調査し、ブラウザーに出力されたHTMLを調べたところ、これがWebContentクラスのプロパティ名の問題であることがわかりました。

public virtual String content { get; set; }

TinyMCEエディターは、コンテンツ変数を使用して、エディターインターフェイスに関連付けられた特定の特性を定義します。これにより、エディターでのユーザー入力によって生成されたHTMLの「コンテンツ」がModelプロパティにマップされないようになりました。

モデルクラスのプロパティの名前を変更するだけで(そしてもちろん、対応するデータベースマッピングとビュー参照を修正するだけで)、問題はすぐに修正されました。

public virtual String web_data_content { get; set; }

他のすべては同一であり、これはUIHint属性とAllowHTML属性で完全に機能しました。

于 2013-02-01T03:30:50.917 に答える
2

アクションにこの属性を追加します

[ValidateInput(false)]

これはあなたの問題を解決するはずです

于 2013-01-30T06:49:09.220 に答える
0

ie7を使用する場合、これにはエラーが発生する可能性があります

<input type="submit" value="Update" /> 

ボタンに名前を付けます

于 2013-01-30T06:14:14.740 に答える