Asp.net mvc 3 如何检查FormCollection[“key”是否存在
我正在使用ASP.NET MVC 3,我在视图中发布了一个表单,其中包含一个Asp.net mvc 3 如何检查FormCollection[“key”是否存在,asp.net-mvc-3,listbox,formcollection,Asp.net Mvc 3,Listbox,Formcollection,我正在使用ASP.NET MVC 3,我在视图中发布了一个表单,其中包含一个@Html.ListBoxFor 当我收到作为FormCollection发布的表单时,如何检查是否在列表框中选择了某个项目 在我的控制器中,似乎没有名为集合[“Company.RepresentingCountries”]的项目,因为没有选择选项。。这会导致“对象引用未设置为对象的实例”。当我尝试检查它时,会显示错误消息!这里的协议是什么 谢谢 您可以通过以下方式访问表单内容: foreach (var key in
@Html.ListBoxFor
当我收到作为FormCollection发布的表单时,如何检查是否在列表框中选择了某个项目
在我的控制器中,似乎没有名为集合[“Company.RepresentingCountries”]
的项目,因为没有选择
选项。。这会导致“对象引用未设置为对象的实例”。当我尝试检查它时,会显示错误消息!这里的协议是什么
谢谢 您可以通过以下方式访问表单内容:
foreach (var key in Request.Form.AllKeys)
{
System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", key, Request.Form[key]));
}
您可以看到使用类似于DebugView的工具编写的调试内容。
当然,您可以在此处设置断点或以任何其他方式检查此集合
发布时始终具有“selected”值(如果用户未选择它,则它是其中的第一个选项),因此如果您设置“empty”默认值,则它将在集合中发布,其值将为“”(string.empty)
更新当select具有multiple=“multiple”属性时,则无所选值意味着表单序列化将不考虑它,因此它不会成为表单集合的一部分。若要检查是否已选择值,请使用
集合[“Company.RepresentingCountries”]==null
,或字符串.IsNullOrEmpty(集合[“Company.RepresentingCountries”])
。当没有选择的值时,这两个值都为真,但如果选择中有空选项,则第二个值可能为真。您可以通过以下方式访问表单内容:
foreach (var key in Request.Form.AllKeys)
{
System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", key, Request.Form[key]));
}
您可以看到使用类似于DebugView的工具编写的调试内容。
当然,您可以在此处设置断点或以任何其他方式检查此集合
发布时始终具有“selected”值(如果用户未选择它,则它是其中的第一个选项),因此如果您设置“empty”默认值,则它将在集合中发布,其值将为“”(string.empty)
更新当select具有multiple=“multiple”属性时,则无所选值意味着表单序列化将不考虑它,因此它不会成为表单集合的一部分。若要检查是否已选择值,请使用
集合[“Company.RepresentingCountries”]==null
,或字符串.IsNullOrEmpty(集合[“Company.RepresentingCountries”])
。当没有选定的值时,这两个值都是真的,但如果在select中有空选项,则第二个值可能是真的。您还没有显示如何定义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
@使用(Html.BeginForm())
{
@Html.ListBoxFor(
x=>x.SelectedItemIds,
新选择列表(Model.Items、“Value”、“Text”)
)
@Html.ValidationMessageFor(x=>x.SelectedItemIds)
}
您还没有展示您的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
@使用(Html.BeginForm())
{
@Html.ListBoxFor(
x=>x.SelectedItemIds,
新选择列表(Model.Items、“Value”、“Text”)
)
@Html.ValidationMessageFor(x=>x.SelectedItemIds)
}
您好,谢谢您的回答,可能应该提到ListBoxFor创建了一个
,因此它在默认情况下似乎没有“selected”,因此在我的FormCollection中没有名为Company.RepresentingCountries的键。我已检查了多个没有选择值的大小写。它不会序列化到表单集合中。我现在将更新我的答案。感谢您的更新,我在执行if(!string.IsNullOrEmpty(collection[“Company.RepresentingCountries”])
时实际上仍然会遇到错误,但是检查null可能会解决问题!好吧,我尝试了这两种方法(在我处理的表单上进行multiselect并将其发布回控制器),它成功了,并且只有在为集合编制索引时才能得到异常,所以在检查null时才能得到异常。我现在将检查替代方案。您使用的是哪个版本的mvc?我没有发现错误,甚至collection.GetValue(“adfasdf”)返回null,对我来说也不例外。您好,感谢您的回答,可能应该提到ListBoxFor创建了一个
,因此它在默认情况下似乎没有“selected”选项,因此,在我的FormCollection中没有名为Company.RepresentingCountries的键。我已检查了多个没有选择值的大小写。它不会序列化到表单集合中。我现在将更新我的答案。感谢您的更新,我在执行if(!string.IsNullOrEmpty(collection[“Company.RepresentingCountries”])
时实际上仍然会遇到错误,但是检查null可能会解决问题!好吧,我尝试了这两种方法(在我处理的表单上进行multiselect并将其发布回控制器),它成功了,并且只有在为集合编制索引时才能得到异常,所以在检查null时才能得到异常。我现在将检查替代方案。您使用的是哪个版本的mvc?我没有得到这个错误,即使collection.GetValue(“adfasdf”)返回null,对我来说也不例外。谢谢,我会尝试这样做的。。所以最主要的是“ModelState.IsValid相当有效.。@Niclas Lindqvist,ModelState.IsValid
将确保您在视图模型上放置的所有验证规则都得到遵守。不会回答中的问题。”title@DaveO,在回答有关的问题时,就我个人而言,我更愿意考虑OP的情况,以便根据我的想法提供最好的答案,而不是盲目和轻率