我的情况是这样的:我有两个列表框,一个包含我的所有数据库项目,另一个包含空数据库项目。用户将完整列表框中所需的项目添加到空列表框中。
我正在使用表单提交用户添加的所有项目。
问题是,只提交列表框中的选定项目。因此,如果用户取消选择某些项目,则不会在表单中提交。我的观点如下:
<% using (Html.BeginForm("MyAction", "MyController"))
{ %>
<%= Html.ListBox("AddedItems", Model.Items)%>
<input type="submit" value="Submit" name="SubmitButton"/>
<% } %>
我的控制器看起来像这样:
public ActionResult MyAction(FormCollection formCollection)
{
var addedItems = formCollection["AddedItems"].Split(',');
//....more code that does stuff with the items
}
我会以错误的方式处理一切吗?有没有更好的方式来提交物品?你会做什么?
答案 0 :(得分:23)
我也这样做,我觉得我解决它的方式更优雅一点。基本上我只有一个Jquery函数,它在选择所有选项的表单发布之前运行。
$(function () {
$("form").submit(function (e) {
$("#box2View option").attr("selected", "selected");
});
});
答案 1 :(得分:2)
因为它只是选择框。您无法在selectbox中发布所有值。你必须使用javascript来捕获添加的项目并将它们存储在隐藏的输入中。
未经测试的代码,但我认为它对您有帮助。
<script type="text/javascript">
function addItem() {
var allItems = document.getElementById("AllItems");
var op = allItems.options[allItems.selectedIndex];
var hdSelectedItems = document.getElementById("hdSelectedItems");
var lbSelectedItems = document.getElementById("lbSelectedItems");
lbSelectedItems.options[lbSelectedItems.options.length] = op;
if (hdSelectedItems.value != '') {
hdSelectedItems.value += ","
}
hdSelectedItems.value += op.value;
}
</script>
<%= Html.Hidden("hdSelectedItems") %>
<%= Html.ListBox("AllItems", Model.Items)%>
<%= Html.ListBox("lbSelectedItems") %>
<a href="#" onclick="addItem(); return false;">Add</a>
答案 2 :(得分:1)
为什么不在复选框中列出项目列表。 然后,您可以遍历操作中的复选框并抓取所有选中的复选框。
<% foreach(var item in Model.Items) { %>
<%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id
<% } %>
public ActionResult MyAction(FormCollection formCollection)
{
foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>())
{
// iterates thru check boxes we got rid of the button
}
}