3

Html.Post内のアクションメソッドに辞書を渡そうとしています

Html.BeginForm("ProcessStage2", "Supplier", new {bookVars = Model.BookVars} , FormMethod.Post, new { name = "frmBook" })

モデルの他のプロパティ(int、string、...)を渡すことはできますが、ディクショナリを渡すことはできません。それを達成するチャンスはありますか?辞書には29のペアがあり、分割して渡すには多すぎるようです。

4

4 に答える 4

3

辞書をシリアル化し、文字列として渡します(おそらくbase64でエンコードされています)。

于 2012-05-09T10:01:04.863 に答える
3

隠しフィールドとエディター テンプレートを使用できます。例を見てみましょう:

モデル:

public class MyViewModel
{
    public IDictionary<string, string> BookVars { get; set; }
}

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            // fill the dictionary with some dummy data
            BookVars = Enumerable
                .Range(1, 5)
                .ToDictionary(x => "key" + x, x => "value" + x)
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // the model.BookVars property will be properly bound here
        return View(model);
    }
}

ビュー ( ~/Views/Home/Index.cshtml):

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.BookVars)
    <button type="submit">OK</button>
}

エディター テンプレート (~/Views/Home/EditorTemplates/KeyValuePair`2.cshtml):

@model KeyValuePair<string, string>

@Html.Hidden("Key", Model.Key)
@Html.Hidden("Value", Model.Value)

ディクショナリの各要素に対して自動的にレンダリングされるエディター テンプレートの名前に注意してください: KeyValuePair`2.cshtml

申し訳ありませんが、SO のエディターを使用してこれを適切にフォーマットすることはできませんが、ファイルの名前は次のようにする必要KeyValuePair[grave accent]2.cshtml[grave accent]あります

また、コレクションとディクショナリのワイヤ フォーマットについて読むことも忘れないでください。デフォルトのモデル バインダーは、内部で何が起こっているかをよりよく理解することを期待しています。

于 2012-05-09T09:58:02.487 に答える
2

いいえ、オブジェクトをパラメータとして渡すことはできません。唯一の方法は、オブジェクトをデータベースに保存し、そのオブジェクトのIDのみをPOSTで渡すことです。そのディクショナリを含むモデルを作成する必要があります。

public int id {get;set;}
public Dictionary<string, int> Dictionary {get;set};

サーバー側からIDでロードします。

于 2012-05-09T09:49:40.677 に答える
0

たとえば、json シリアライゼーションを使用してそれを行うことができます。非常に柔軟でエレガントに見えるので、これをお勧めします。

モデルには、オブジェクトの任意のセットを含めることができます。あなたの場合は次のとおりです。

public class MyViewModel
{
    public IDictionary<string, string> BookVars { get; set; }
}

コントローラーでは、必要に応じていくつかのデータをスタブできます。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // mock data
        var model = new MyViewModel
                            {BookVars = new Dictionary<string, string> {{"key1", "value1"}, {"key2", "value2"}}};

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // the binded model is avaliable
        return View(model);
    }
}

ビューにはフォームが含まれており、ajax 送信用のカスタム スクリプトが含まれています。値は、どのような方法でも永続化および変更できます。たとえば、隠しフィールドを使用できます。

@model MyViewModel

<script src="/Scripts/script.js" type="text/javascript"></script>

<script type="text/javascript">
        $(document).ready(function () {
            $('form').frmBookSubmit();
        });
</script>

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { name = "frmBook" }))
{
    <div class="books">
        @foreach (var item in Model.BookVars)
        {
            <input type="hidden" key="@item.Key" value="@item.Value" />        
        }
    </div>
    <input type="submit" />
}

Script.js は、データの json シリアル化を使用して ajax 送信用の単純な jquery プラグインを作成します。

(function ($) {

    $.fn.frmBookSubmit = function () {
        var $this = $(this);
        if ($this != null && $this != 'undefined' && $this.length > 0) {
            $this.submit(function (e) {
                e.preventDefault();

                var myviewmodel = new Object();
                myviewmodel.BookVars = $this.find(".books").booksCollect();
                var data = { model: myviewmodel };
                var jsonString = JSON.stringify(data);

                $.ajax({
                    url: $this.attr("action"),
                    type: 'POST',
                    dataType: 'json',
                    data: jsonString,
                    contentType: 'application/json; charset=utf-8'
                });

            });
        }
    };

    $.fn.booksCollect = function () {
        var books = new Array();
        $(this).find("input").each(function () {
            var k = $(this).attr('key');
            var v = $(this).attr('value');
            var item = {
                Key: k,
                Value: v
            };
            books.push(item);
        });
        return books;
    };

})(jQuery);

便利な場合は、たとえば Newtonsoft.Json ライブラリを使用してカスタム json バインダーを作成することもできます。

あなたは終わった。

于 2012-05-09T11:35:14.403 に答える