1

これは私が問題を抱えている行です:

<% using(Html.BeginForm("Create#result", "Report", FormMethod.Post)) { %>

C# 3.5 と MVC2 を使用すると、フォームは次のようにレンダリングされます。

<form action="/Report.aspx/Create#result" method="post">

C# 4.0 と MVC2 では、フォームは次のようにレンダリングされます。

<form action="/Report.aspx/Create%23result" method="post">

これは問題を引き起こします:

System.Web.HttpException (0x80004005): A public action method 'Create#result' was not found

新しい動作には問題があり、ハッシュをエスケープしたくないと思います。どこで発生しますか?行動を変えることはできますか?

MVC のバージョンはいずれ更新されるはずですが、この動作が問題を引き起こし始めたとき、私は別の部分に取り組んでいました。

アップデート

クライアントでjqueryを使用してフォームアクションを更新することで解決しました。

フォーム

<% using(Html.BeginForm("Create", "Report", FormMethod.Post, new { id = "frmReport" })) { %>

Javascript

var frmReport = $("#frmReport");
if (0 < frmReport.length) {
    var action = frmReport.attr("action");
    action = action + "#result";
    frmReport.attr("action", action);
}
4

1 に答える 1

2

これはMVCクラスの奥深くで発生しますSystem.Web.Mvc.TagBuilder。つまり、MVCクラスについてできることはあまりないでしょう。このコードが変更されていなくても驚かないでしょうが、基盤となるhtmlエンコーディング関数が代わりに.NET4で変更されています。

private void AppendAttributes(StringBuilder sb)
{
    foreach (KeyValuePair<string, string> current in this.Attributes)
    {
        string key = current.Key;
        if (!string.Equals(key, "id", StringComparison.Ordinal) || !string.IsNullOrEmpty(current.Value))
        {
            string value = HttpUtility.HtmlAttributeEncode(current.Value);
            sb.Append(' ').Append(key).Append("=\"").Append(value).Append('"');
        }
    }
}

とはいえ、そもそもこれがうまく機能していたことに驚いています。一部のブラウザ(IE)は、フォームのポストバックでハッシュタグをサポートしていないと思います。

于 2012-10-22T21:26:21.733 に答える