129

私は ASP.NET MVC 4 アプリに取り組んでいます。このアプリには基本的なフォームがあります。私のフォームのモデルは次のようになります。

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

私のフォームには、次の HTML があります。

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

フォームを投稿すると、モデルの記憶値が常に false になります。ただし、モデルの Name プロパティには値があります。以下にブレークポイントを設定して、これをテストしました。

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

私はそれを理解することはできません。チェックボックスの値が設定されないのはなぜですか?

4

19 に答える 19

226
@Html.EditorFor(x => x.Remember)

生成します:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

それはどのように機能しますか:

  • checkboxオフのままの場合、フォームはhidden値のみを送信します (false)
  • オンにすると、フォームは 2 つのフィールド (false と true) と trueモデルのboolプロパティの MVC セットを送信します

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

チェックすると、常にデフォルト値が送信されます。

于 2013-02-06T14:33:39.300 に答える
73

Model.Name を使用して値を設定しているため。空のビュー モデルをビューに渡していると仮定します。

したがって、Remember の値は false であり、checkbox 要素の値を false に設定します。これは、チェックボックスを選択すると、フォームに値「false」を投稿していることを意味します。選択しないと投稿されないため、モデルはデフォルトで false になります。どちらの場合も偽の値が表示されるのはそのためです。

値は、選択ボックスをチェックした場合にのみ渡されます。Mvc でチェックボックスを使用するには

@Html.CheckBoxFor(x => x.Remember)

または、モデルをビューにバインドしたくない場合。

@Html.CheckBox("Remember")

Mvc は、非表示フィールドでいくつかの魔法を行い、選択されていないときに値を保持します。

編集、それを行うことに本当に嫌悪感があり、自分で要素を生成したい場合は、そうすることができます。

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />
于 2013-02-06T14:03:25.663 に答える
5

それ以外の

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

使用する:

 @Html.EditorFor(x => x.Remember)

これにより、Remember専用のチェックボックスが表示されます

于 2013-02-06T13:54:53.837 に答える
4

さて、チェックボックスは少し奇妙です。Html ヘルパーを使用すると、マークアップに 2 つのチェックボックス入力が生成され、チェックされている場合は両方とも IEnumerable の名前と値のペアとして渡されます。

マークアップでチェックされていない場合、false の値を持つ非表示の入力のみに渡されます。

たとえば、あなたが持っているマークアップでは:

      @Html.CheckBox("Chbxs") 

コントローラ アクションで (名前がコントローラのチェックボックス パラメータ名と一致することを確認してください):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

次に、コントローラーで次のようなことを実行できます。

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

これがエレガントなソリューションではないことはわかっています。ここの誰かがいくつかの指針を与えてくれることを願っています。

于 2014-01-26T07:11:07.093 に答える
3

フォームのチェック ボックスから返された値をブール プロパティに変換するために、カスタム ModelBinder のビルド コンバーターで ValueProviderResult を使用しました。

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
于 2014-10-02T16:00:22.757 に答える
3

モデルではなく FormCollection を使用する場合、割り当ては次のように単純になります。

MyModel.Remember = fields["Remember"] != "false";
于 2018-08-09T14:23:43.640 に答える
3

(なんらかの理由で) 組み込みの HtmlHelper 拡張機能ではなくプレーンな HTML を本当に使用したい場合は、この方法で行うことができます。

それ以外の

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

使ってみて

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

HTML のチェックボックス入力は、チェックされている場合は値を送信し、チェックされていない場合は何も送信しないように機能します (これにより、ASP.NET MVC は、フィールド、false)。また、HTML のチェックボックスの値は true/false だけでなく、何でもかまいません。そのため、本当に必要な場合は、モデルの文字列フィールドにチェックボックスを使用することもできます。

組み込みの を使用するとHtml.RenderCheckbox、実際にはチェックボックスと非表示フィールドの 2 つの入力が出力されるため、チェックボックスがオフの場合 (何もないだけでなく)、false 値が送信されます。これにより、次のような予期しない状況が発生する可能性があります。

于 2018-02-08T14:31:37.377 に答える
2

これは大きな苦痛であり、もっとシンプルにすべきだと感じています。これが私のセットアップと解決策です。

次の HTML ヘルパーを使用しています。

@Html.CheckBoxFor(model => model.ActiveFlag)

次に、コントローラーでフォーム コレクションをチェックし、それに応じて処理します。

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
于 2016-10-19T15:07:39.283 に答える
2

私は同様の問題に遭遇し、チェックボックス、hiddenfor、および小さな JQuery を次のように使用して、チェックボックスの値を取り戻すことができました。

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>
于 2014-12-01T22:07:15.037 に答える
1
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });
于 2015-02-02T16:10:24.993 に答える
1

私はちょうどこれに出くわしました(オン/オフをバインドしないなんて信じられません!)

いずれかの方法!

<input type="checkbox" name="checked" />

「オン」または「オフ」の値を投稿します。

これはブール値にバインドしませんが、このばかげた回避策を実行できます!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}
于 2015-01-28T22:12:39.037 に答える
0
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}
于 2015-06-14T12:50:27.420 に答える
0

同じ名前の複数のチェックボックスの場合...不要な false を削除するコード:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

関数

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

これを使って :

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}
于 2015-05-19T16:02:11.517 に答える
0

このように覚えておいてください

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

コントローラーで nullable bool を使用し、このように null で false にフォールバックします

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}
于 2016-12-19T07:55:36.227 に答える