79

私が知りたいのは、Html.CheckBoxForASP.NET MVC の HTML ヘルパーの適切な構文だけです。

私が達成しようとしているのは、チェックボックスが最初にID値でチェックされるようにすることです。これにより、コントローラーでそれを参照して、まだチェックされているかどうかを確認できます。

以下は適切な構文でしょうか?

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}
4

7 に答える 7

127

それは適切な構文ではありません

最初のパラメーターはチェックボックスの値ではなく、チェックボックスのビュー モデル バインディングです。

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

最初のパラメーターは、モデル内のブール型のプロパティ (値を返す匿名メソッドではなく式) を識別する必要があり、2 番目のプロパティは、追加の HTML 要素の属性を定義します。上記の属性が最初にチェックボックスをオンにするかどうかは 100% 確信が持てませんが、試すことはできます。しかし、注意してください。有効なモデル データをロードし、その特定のプロパティが に設定されている場合は、機能する可能性がありますが、後で問題が発生する可能性がありますfalse

正しい方法

私の適切な提案は、初期化されたモデルをビューに提供し、その特定のブール値プロパティを に初期化することtrueです。

プロパティの種類

Asp.net MVCHtmlHelper拡張メソッドと内部作業に従って、チェックボックスは整数ではなくブール値にバインドする必要があります。その場合、非表示フィールドにid.

その他のヘルパー

もちろん、チェックボックスの値と動作に関する柔軟性を高めるために使用できるヘルパー メソッドは他にもあります。

@Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true });

: checked は HTML 要素のブール プロパティであり、value 属性ではないため、任意の値を割り当てることができます。正しい HTML 構文には割り当てが含まれていませんが、HTML 要素のプロパティとしてレンダリングされる未定義のプロパティを持つ匿名の C# オブジェクトを提供する方法はありません。

于 2012-10-01T13:58:31.583 に答える
17

デフォルトでは、モデル プロパティが html 属性をオーバーライドするため、以下のコードはチェックされたチェック ボックスを生成しません。

@Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" });

代わりに、GET アクションメソッドで次のことを行う必要があります。

model.SomeBooleanProperty = true;

上記は、モデルが有効でない場合でも (ボックスのチェックを外した場合) 、選択を保持します(つまり、フォームの投稿時にエラーが発生します)。

ただし、次のコードは確かにチェックされたチェックボックスを生成しますが、チェックされていない応答を保持せず、フォームのエラーのたびにチェックボックスをチェックします。

 @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" });

アップデート

//Get Method
   public ActionResult CreateUser(int id)
   {
        model.SomeBooleanProperty = true;         
   }

上記のコードは、開始時にチェックされたチェックボックスを生成し、フォームにエラーが発生した場合でも選択を保持します。

于 2013-09-05T14:21:54.763 に答える
8

モデルの値が明らかにtrueに設定されていても、CheckBoxForがサーバー側の検証の失敗時にチェックボックスをチェックしないASP.NET MVC 5に問題がありました。私のRazorマークアップ/コードは次のようになりました:

@Html.CheckBoxFor(model => model.MyBoolValue, new { @class = "mySpecialClass" } )

これを機能させるには、これを次のように変更する必要がありました。

@{
    var checkboxAttributes = Model.MyBoolValue ?
        (object) new { @class = "mySpecialClass", @checked = "checked" } :
        (object) new { @class = "mySpecialClass" };
}
@Html.CheckBox("MyBoolValue", checkboxAttributes)
于 2014-07-01T17:17:48.223 に答える
4

CSHTMLに以下を追加するまで、POSTにバインドするときに上記の答えはどれもうまくいきませんでした

<div class="checkbox c-checkbox">
    <label>
        <input type="checkbox" id="xPrinting" name="xPrinting" value="true"  @Html.Raw( Model.xPrinting ? "checked" : "")>
        <span class=""></span>Printing
    </label>
</div>


// POST: Index

[HttpPost]
public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)
于 2016-04-01T04:40:32.697 に答える
1

次のように、データベースからラベルを動的に表示するソリューションを探していました。

checkbox1 : Option 1 text from database
checkbox2 : Option 2 text from database
checkbox3 : Option 3 text from database
checkbox4 : Option 4 text from database

したがって、上記の解決策はどれもうまくいかなかったので、次のように使用しました。

 @Html.CheckBoxFor(m => m.Option1, new { @class = "options" }) 
 <label for="Option1">@Model.Option1Text</label>

 @Html.CheckBoxFor(m => m.Option2, new { @class = "options" }) 
 <label for="Option2">@Mode2.Option1Text</label>

このようにして、ユーザーがラベルをクリックすると、チェックボックスが選択されます。

それは誰かを助けることができるかもしれません。

于 2014-06-14T17:18:32.630 に答える
1

これを機能させるのに問題があり、FromCollection を使用したい/必要とする人のために別のソリューションを追加しました。

それ以外の:

@Html.CheckBoxFor(model => true, item.TemplateId) 

HTML ヘルパーを次のようにフォーマットします。

@Html.CheckBoxFor(model => model.SomeProperty, new { @class = "form-control", Name = "SomeProperty"})

次に、ロジックがどこにあるビューモデル/モデルでも:

public void Save(FormCollection frm)
{   
    // to do instantiate object.

    instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

    // to do and save changes in database.
}
于 2016-07-27T09:38:58.893 に答える