【问题标题】:How can i check if FormCollection["key"] exists我如何检查 FormCollection["key"] 是否存在
【发布时间】:2011-06-28 06:46:04
【问题描述】:

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

当我收到作为 FormCollection 发布的表单时,如何检查是否在 ListBox 中选择了某个项目?

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可以通过这种方式访问​​表单内容:

    foreach (var key in Request.Form.AllKeys)
    {
        System.Diagnostics.Debug.WriteLine(string.Format("{0}:{1}", key, Request.Form[key]));
    }
    

    您可以使用 DebugView 之类的工具查看您写入 Debug 的内容。 当然,您可以在此处设置断点或以任何其他方式检查此集合。

    UPDATE 当 select 有 multiple="multiple" 属性时,none selected value 表示表单序列化不会考虑它,所以它不会成为表单集合的一部分。要检查您是否选择了值,请使用collection["Company.RepresentingCountries"] == nullString.IsNullOrEmpty(collection["Company.RepresentingCountries"])。当没有选定的值时,两者都为真,但如果您在选择中有空选项,则第二个可能为真。

    【讨论】:

    • 嗨,感谢您的回答,可能应该提到 ListBoxFor 创建了一个<select multiple="multiple">,因此默认情况下它似乎没有“选择”,所以没有名为 Company 的键.RepresentingCountries 在我的 FormCollection 中。
    • 我检查了多个没有选定值的案例。它不会被序列化为表单集合。我现在将更新我的答案。
    • 感谢更新,实际上我在执行if(!string.IsNullOrEmpty(collection["Company.RepresentingCountries"])) 时仍然遇到错误,但也许检查 null 就可以了!
    • 好吧,我都试过了(在我处理的表单上进行了多选并返回到控制器),它工作了,只有在索引集合时你才能得到异常,所以你会得到它以及什么时候检查空值。我现在将检查替代方案。
    • 你使用的是哪个版本的mvc?我没有收到错误,即使 collection.GetValue("adfasdf") 返回 null,对我来说也不例外。
    【解决方案2】:

    你还没有展示你的 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" />
    }
    

    【讨论】:

    • 谢谢,我会尝试那样做的。所以主要是“ModelState.IsValid 差不多..?
    • @Niclas Lindqvist, ModelState.IsValid 将确保遵守您在视图模型上设置的所有验证规则。
    • 没有回答标题中的问题
    • @DaveO,在回答关于 SO 的问题时,我个人更喜欢考虑到 OP 的情况,以便根据我提供最佳答案,而不是盲目地逐字回答问题。
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 2018-05-30
    • 2017-06-18
    • 2023-02-07
    • 1970-01-01
    • 2021-07-23
    • 2018-05-20
    • 2020-09-25
    相关资源
    最近更新 更多