我有这个方法:
[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" />
}
在执行POST时,我根本不明白为什么selectedVisualisers
始终为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
答案 0 :(得分: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;
声明也存在问题。这可能会在您提交给服务器的索引中留下 hole ,这些索引根据默认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
注意索引中的 hole ,如果continue
语句被命中,可能会发生这种情况。为了解决这个问题,我建议您使用非顺序索引。如果您还没有这样做,请阅读Phil Haack的文章,我之前在我的回答中已经链接过了。他在一个单独的部分解释了非顺序索引。所以继续,使用它们。 Steven Sanderson在他的优秀Editing Variable Length List in ASP.NET MVC博客文章中展示了一位优秀的Html.BeginCollectionItem
定制助手,您可以根据自己的需要进行调整。