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" />
}

我根本不明白为什么selectedVisualisers在做 POST 时总是为空。

你有什么线索吗?我看到很多这样的例子,也许我错过了一些东西......

更新

生成的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>元素内部您至少有一些输入。

使用 FireBug 或 Chrome 开发人员工具栏来检查作为 POST 请求的有效负载发送到服务器的确切内容。

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 回答