0

私はこの方法を持っています:

 [HttpPost]
    public ActionResult LaunchVisualiser(IList<VisualiserModel> selectedVisualisers, int implicitSelectedVisualiserId)
    {
        List<int> selectedSearchQueries = searchQueryRepository.GetSearchQueriesOfStreamsIds(selectedVisualisers.Where(v => v.Selected == true).Select(v => v.Stream.Id).ToList());
   // rest of my code
    }

そしてビューで:

@model List<SocialCrm.Models.VisualiserModel>

@using (Html.BeginForm("LaunchVisualiser", "Platform", new { implicitSelectedVisualiserId = ViewBag.CurrentVisualiser.Id }, FormMethod.Post))
{
    for (int i = 0; i < Model.Count; i++) 
    {
        if (Model[i].Id == ViewBag.CurrentVisualiser.Id)
        {
            continue;
        }

    @Html.HiddenFor(m => Model[i].Stream.Id)
    <div class="editor-label">
        @Html.CheckBoxFor(m => Model[i].Selected)
        @Html.DisplayFor(m => Model[i].Name)
    </div>
    }
    <br />
    <br />
    <input type="submit" class="btn btn-success" name="temp" value="Launch Visualiser" />
}

selectedVisualisersPOSTを実行するときに常にnullになる理由がわかりません。

手がかりはありますか?このような例をたくさん見ましたが、何かが足りないのかもしれません...

更新

生成されたhtmlは次のとおりです。

<form action="/platform/launchvisualiser?implicitSelectedVisualiserId=1" method="post">
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[1].Stream.Id" type="hidden" value="9">    <div class="editor-label">
        <input data-val="true" data-val-required="The Selected field is required." name="[1].Selected" type="checkbox" value="true"><input name="[1].Selected" type="hidden" value="false">
        test java hiring visualiser
    </div>
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[2].Stream.Id" type="hidden" value="8">    <div class="editor-label">
        <input data-val="true" data-val-required="The Selected field is required." name="[2].Selected" type="checkbox" value="true"><input name="[2].Selected" type="hidden" value="false">
        vis test
    </div>
    <br>
    <br>
    <input type="submit" class="btn btn-success" name="temp" value="Launch Visualiser">
</form>

これはフォームデータでサーバーに送信されます(Chromeで検査):

[1].Stream.Id:9
[1].Selected:true
[1].Selected:false
[2].Stream.Id:8
[2].Selected:false
4

1 に答える 1

1

このようにしてみてください:

@Html.HiddenFor(m => m[i].Stream.Id)
<div class="editor-label">
    @Html.CheckBoxFor(m => m[i].Selected)
    @Html.DisplayFor(m => m[i].Name)
</div>

ところで、この Razor ビューの生成された HTML を調べたときに、ifステートメントが複数回ヒットしていないこと、および<form>要素内に少なくともいくつかの入力があったことを願っています。

POST リクエストのペイロードとして正確に何がサーバーに送信されるかを検査するには、FireBug または Chrome 開発者ツールバーを使用します。

continue;また、この発言にも問題があります。これにより、サーバーに送信しているインデックスにが残る可能性があります。これは、デフォルトの予期される形式によると無効ですmodel binder for binding to a list

Fiddler で POST ペイロードを検査すると、次のことが表示されないはずです (問題があります)。

[0].Stream.Id = 5
[0].Selected = true
[0].Name = name 1
[2].Stream.Id = 7
[2].Selected = true
[2].Name = name 4

ステートメントがヒットした場合に発生する可能性のあるインデックスのに注意してください。continueこれを修正するには、非シーケンシャル インデックスを使用することをお勧めします。まだ行っていない場合は、私の回答で以前にリンクした Phil Haack の記事を読んでください。ノンシーケンシャル インデックスについては、別のセクションで説明しています。それでは、それらを使用してください。Steven Sanderson は、ASP.NET MVC の可変長リストを編集する優れたブログ投稿で、ニーズに合わせて調整できる優れたHtml.BeginCollectionItemカスタム ヘルパーを示しました。

于 2013-07-01T19:56:26.897 に答える