Asp.net mvc 3 如何检查FormCollection[“key”是否存在

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

我正在使用ASP.NET MVC 3,我在视图中发布了一个表单,其中包含一个
@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的情况,以便根据我的想法提供最好的答案,而不是盲目和轻率