14

私はMVCビューを持っています

<%@ Page Language="C#" MasterPageFile="PathToMaster" Inherits="System.Web.Mvc.ViewPage<ModelData>" %>

そして、一連のチェックボックスの HTML マークアップを含むフォームがあります。

<label for="MyCheckbox">Your choice</label>
<input type="checkbox" id="Option1" class="checkbox" name="MyCheckbox" value="Option one" />
<label for="Option1">Option one</label><br />
<input type="checkbox" id="Option2" class="checkbox" name="MyCheckbox" value="Option two" />
<label for="Option2">Option two</label><br />

コントローラーとアクションのペアがあります

class MyController : Controller {
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult RequestStuff( ModelData data )
    {
    }
}

そのアクションは、フォームが送信されたときに呼び出されます。

ModelDataチェックボックスを のメンバー(および追加する必要があるメンバー)にマップしてModelData、フォームが送信されたときに、dataどのチェックボックスがチェックされているかに関する情報を保存するにはどうすればよいですか?

4

2 に答える 2

11

OK、これは MVC3 用ですが、構文の変更を除けば、MVC2 でも動作するはずです。アプローチは本質的に同じです。

まず、適切な(ビュー)モデルを準備する必要があります

public class MyViewModel
{
    [DisplayName("Option 1")]
    public bool Option1 { get; set; }

    [DisplayName("Option 2")]
    public bool Option2 { get; set; }
}

次に、このモデルを表示しているビュー (コントローラー) に渡します。

public ActionResult EditMyForm()
{
    var viewModel = new MyViewModel()
    return View(viewModel);
}

フォームで:

@model MyViewModel
@using( Html.BeginForm())
{
    @Html.Label("Your choice")

    @Html.LabelFor(model => model.Option1) // here the 'LabelFor' will show you the name you set with DisplayName attribute
    @Html.CheckBoxFor(model => model.Option1)

    @Html.LabelFor(model => model.Option2)
    @Html.CheckBoxFor(model => model.Option2)
    <p>
        <input type="submit" value="Submit"/>
    </p>
}

ここで、HTML ヘルパー (すべてCheckBoxFor、など) を使用してLabelForEditorForデータをモデル プロパティにバインドできます。

EditorForプロパティのタイプboolが の場合、ビューにもチェックボックスが表示されます。:)

そして、コントローラーに送信すると、値が自動バインドされます。

[HttpPost]
public ActionResult EditMyForm(MyViewModel viewModel)
{
    //And here the view model's items will be set to true/false, depending what you checked.
}
于 2012-05-18T09:05:25.133 に答える
3

最初SelectListに Options を定義します。これは、チェックボックスをレンダリングするためだけに使用されます

    public IList<SelectListItem> OptionsSelectList { get; set; }

それよりも、投稿後に選択した単一のオプションの値を保持するモデルを定義します

public class ChooseOptionViewModel
{
    public int OptionIdentifier { get; set; } //name or id
    public bool HasBeenChosen { get; set; } //this is mapped to checkbox
}

次に、これらのオプションの IListModelData

public IList<ChooseOptionViewModel> Options { get; set; }

そして最後に、ビュー

    @for (int i = 0; i < Model.OptionsSelectList.Count(); i++)
    {
        <tr>
            <td class="hidden">
                @Html.Hidden("Options[" + i + "].OptionIdentifier", Model.OptionsSelectList[i].Value)
            </td>
            <td>
                @Model.OptionsSelectList[i].Text
            </td>
            <td>
                @Html.CheckBox("Options[" + i + "].HasBeenChosen", Model.Options != null && Model.Options.Any(x => x.OptionIdentifier.ToString().Equals(Model.OptionsSelectList[i].Value) && x.HasBeenChosen))
            </td>
        </tr>
    }

投稿後、検査するだけですOptions.Where(x => x.HasBeenChosen)

これは完全に機能しており、検証エラーが発生した場合などにビューを再表示できます。これは少し複雑に思えますが、これよりも優れた解決策は思いつきませんでした。

于 2012-05-18T09:13:15.370 に答える