私は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"> Remember Me?</label>
フォームを投稿するとき、モデルのRemember値は常にfalseです。ただし、モデルのNameプロパティには値があります。次のようにブレークポイントを設定してこれをテストしました。
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
わかりません。 Checkboxの値が設定されないのはなぜですか?
@Html.EditorFor(x => x.Remember)
生成されます:
<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />
それはどのように動作しますか:
checkbox
がチェックされていない場合、フォームはhidden
の値のみを送信します(false)true
プロパティにbool
を設定します。<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
チェックした場合、これは常にデフォルト値を送信します。
あなたは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\"" : "") />
これだけを使う
$("input[type=checkbox]").change(function () {
if ($(this).prop("checked")) {
$(this).val(true);
} else {
$(this).val(false);
}
});
さて、チェックボックスは少し変です。 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;
}
私はこれが優雅な解決策ではないことを知っています。ここに誰かがいくつかのポインタを与えることができると思います。
フォームのチェックボックスから返された値をブール値のプロパティに変換するために、カスタムModelBinderのValueProviderResultのビルド内コンバーターを使用しました。
ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
の代わりに
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
つかいます:
@Html.EditorFor(x => x.Remember)
それはあなたのために特別にチェックボックスを与えるでしょう
私は似たような問題に遭遇し、チェックボックス、hiddenfor、そしてJQueryを使ってチェックボックスの値を取り戻すことができました。
@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)
<script>
$("#isPreferred").change(function () {
$("#IsPreferred").val($("#isPreferred").val());
})
</script>
これは大きな苦痛であり、それがより単純であるべきであるように感じます。これが私の設定と解決策です。
私は次のHTMLヘルパーを使っています:
@Html.CheckBoxFor(model => model.ActiveFlag)
次に、コントローラで、フォームの収集と処理を確認します。
bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
@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);
});
Modelを使ったMVC用。モデル:
public class UserInfo
{
public string UserID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public bool RememberMe { get; set; }
}
HTML:
<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>
[HttpPost]関数では、そのプロパティを取得できます。
[HttpPost]
public ActionResult Login(UserInfo user)
{
//...
return View(user);
}
public ActionResult Index(string username, string password, string rememberMe)
{
if (!string.IsNullOrEmpty(username))
{
bool remember = bool.Parse(rememberMe);
//...
}
return View();
}
同じ名前の複数のチェックボックスの場合...不要な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++;
}
組み込みの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でのチェックボックス入力は、チェックされたときに値を送信し、チェックされていないときには何も送信しないように機能します。フィールドfalse
)。また、HTMLのチェックボックスの値は、true/falseだけでなく、モデルの文字列フィールドにチェックボックスを使用することもできます。
組み込みのHtml.RenderCheckbox
を使用すると、実際にはチェックボックスと非表示フィールドの2つの入力が出力されるため、チェックボックスをオフにすると(falseだけではなく)偽の値が送信されます。これは、次のような予期しない状況を引き起こす可能性があります。
変更する
public class MyModel
{
public string Name { get; set; }
public bool? Remember { get; set; }
}
コントローラでnull許容ブール値を使用し、このようにnullの場合はfalseにフォールバックする
[HttpPost]
public ActionResult MyAction(MyModel model)
{
model.Remember = model.Remember ?? false;
Console.WriteLine(model.Remember.ToString());
}
私の場合は、getメソッドでモデルプロパティ "Remember"を設定していませんでした。コントローラのロジックを確認してください。あなたは同じことをしているのかもしれません。私はこれが助けを願っています!
私は他の答えを読み、それがうまくいっているわけではありませんでした - だからここに私が終わった解決策があります。
私のフォームはチェックボックスを生成するためにHtml.EditorFor(e => e.Property)
を使います、そしてコントローラでFormCollection
を使うと、これはコントローラで'true,false'
の文字列値を渡します。
結果を処理するときは、ループを使用してそれらを循環させます。フォームから評価されている現在のモデル値を表すためにInfoProperty
インスタンスも使用します。
代わりに、返された文字列がWordの'true'
で始まっているかどうかを確認してから、ブール変数をtrue
に設定し、それを戻りモデルに渡します。
if (KeyName.EndsWith("OnOff"))
{
// set on/off flags value to the model instance
bool keyTrueFalse = false;
if(values[KeyName].StartsWith("true"))
{
keyTrueFalse = true;
}
infoProperty.SetValue(processedInfo, keyTrueFalse);
}
私はちょうどこれに遭遇しました(私はそれがオン/オフに結合しないとは信じられません!)
いずれかの方法!
<input type="checkbox" name="checked" />
"on"または "off"の値を投稿します。
このWONTはブール値にバインドされますが、この愚かな回避策を実行できます。
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; }
}
モデルではなくFormCollectionを使って作業する場合、割り当ては次のように単純になります。
MyModel.Remember = fields["Remember"] != "false";