1

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

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

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

谢谢!

4

2 回答 2

1

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

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"] == nullString.IsNullOrEmpty(collection["Company.RepresentingCountries"])。当没有选定值时,两者都为真,但如果您在选择中有空选项,第二个可能为真。

于 2011-06-28T07:09:12.183 回答
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" />
}
于 2011-06-28T07:25:51.723 回答