我正在使用 ASP.NET MVC 3,并在我的视图中发布了一个表单,其中包含一个@Html.ListBoxFor
当我收到作为 FormCollection 发布的表单时,如何检查是否在 ListBox 中选择了一个项目?
在我的控制器中,似乎没有命名项目collection["Company.RepresentingCountries"]
,因为没有<select>
选择任何选项。这导致“对象引用未设置为对象的实例”。当我尝试检查它时出现错误消息!这里的协议是什么?
谢谢!
我正在使用 ASP.NET MVC 3,并在我的视图中发布了一个表单,其中包含一个@Html.ListBoxFor
当我收到作为 FormCollection 发布的表单时,如何检查是否在 ListBox 中选择了一个项目?
在我的控制器中,似乎没有命名项目collection["Company.RepresentingCountries"]
,因为没有<select>
选择任何选项。这导致“对象引用未设置为对象的实例”。当我尝试检查它时出现错误消息!这里的协议是什么?
谢谢!
您可以通过这种方式访问表单内容:
foreach (var key in Request.Form.AllKeys)
{
System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", key, Request.Form[key]));
}
您可以使用 DebugView 之类的工具查看您写入 Debug 的内容。当然,您可以在此处设置断点或以任何其他方式检查此集合。
<select> 在发布时总是有 'selected' 值(如果用户没有选择它,那么它是其中的第一个选项),所以如果你设置“empty”默认值,它将被发布到集合中,它的值将是“”(字符串。空)。
更新当 select 有 multiple="multiple" 属性时,none selected value 意味着表单序列化不会考虑它,因此它不会成为表单集合的一部分。要检查您是否选择了值,请使用collection["Company.RepresentingCountries"] == null
或String.IsNullOrEmpty(collection["Company.RepresentingCountries"])
。当没有选定值时,两者都为真,但如果您在选择中有空选项,第二个可能为真。
你还没有展示你的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" />
}