我正在使用ASP.NET MVC 3,并在我的视图中发布了一个包含@Html.ListBoxFor
当我收到张贴的表格作为FormCollection时,如何检查列表框中是否选择了某个项目?
在我的控制器中似乎没有名为collection["Company.RepresentingCountries"]
的项目,因为没有选择<select>
选项。这会导致“对象引用未设置为对象的实例”。我尝试检查它时出现错误消息!这里的协议是什么?
谢谢!
答案 0 :(得分:1)
您可以通过以下方式访问表单内容:
foreach (var key in Request.Form.AllKeys)
{
System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", key, Request.Form[key]));
}
您可以使用DebugView等工具查看您写入Debug的内容。 当然,您可以在此处设置断点或以任何其他方式检查此集合。
&LT;选择&GT;在发布时始终具有“已选择”值(如果用户未选择它,那么它是其中的第一个选项),因此如果您设置“空”默认值,它将在集合中发布,其值将为“” (的String.Empty)。
UPDATE 当select具有multiple =“multiple”属性时,没有选择的值意味着表单序列化不会将其考虑在内,因此它不会成为表单集合的一部分。要检查您是否选择了值,请使用collection["Company.RepresentingCountries"] == null
或String.IsNullOrEmpty(collection["Company.RepresentingCountries"])
。如果没有选定值,则两者都为true,但如果select中有空选项,则第二个可能为真。
答案 1 :(得分:0)
您尚未展示如何定义ListBoxFor
助手,因此我只能在此猜测。这就是说你谈到FormCollection
我不推荐使用哪种用法。我建议使用视图模型。让我们举一个例子:
型号:
public class MyViewModel
{
[Required(ErrorMessage = "Please select at least one item")]
public string[] SelectedItemIds { get; set; }
public SelectListItem[] Items
{
get
{
return new[]
{
new SelectListItem { Value = "1", Text = "Item 1" },
new SelectListItem { Value = "2", Text = "Item 2" },
new SelectListItem { Value = "3", Text = "Item 3" },
};
}
}
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
SelectedItemIds = new[] { "1", "3" }
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (ModelState.IsValid)
{
// The model is valid we know that the user selected
// at least one item => model.SelectedItemIds won't be null
// Do some processing ...
}
return View(model);
}
}
查看:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.ListBoxFor(
x => x.SelectedItemIds,
new SelectList(Model.Items, "Value", "Text")
)
@Html.ValidationMessageFor(x => x.SelectedItemIds)
<input type="submit" value="OK" />
}