如何检查FormCollection [“key”]是否存在

时间:2011-06-28 06:46:04

标签: asp.net-mvc-3 listbox formcollection

我正在使用ASP.NET MVC 3,并在我的视图中发布了一个包含@Html.ListBoxFor

的表单

当我收到张贴的表格作为FormCollection时,如何检查列表框中是否选择了某个项目?

在我的控制器中似乎没有名为collection["Company.RepresentingCountries"]的项目,因为没有选择<select>选项。这会导致“对象引用未设置为对象的实例”。我尝试检查它时出现错误消息!这里的协议是什么?

谢谢!

2 个答案:

答案 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"] == nullString.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" />
}