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> は、投稿時に常に「選択された」値を持ちます (ユーザーが選択していない場合、それは最初のオプションです)。そのため、「空の」デフォルトを設定すると、コレクションに投稿され、その値は"" (string.Empty) になります。

更新select に multiple="multiple" 属性がある場合、値が選択されていないことは、フォームのシリアライゼーションが考慮されないことを意味するため、フォーム コレクションの一部にはなりません。値を選択したかどうかを確認するにはcollection["Company.RepresentingCountries"] == null、 またはを使用しますString.IsNullOrEmpty(collection["Company.RepresentingCountries"])。選択された値がない場合は両方とも true になりますが、select に空のオプションがある場合は 2 番目の値が true になる可能性があります。

于 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 に答える