にはViewModel
次のコードがあります。
public List<MarketingCode> MarketingCodes { get; set; }
タイプはどこですかMarketingCode
:
public class MarketingCode
{
public bool selected
{
get;
set;
}
public MarketingOptionCode name { get; set; }
public string Line { get; set; }
public string value { get; set; }
[Flags]//Indicates that an enumeration can be treated as a bit field; i.e., as a set of flags
public enum MarketingOptionCode
{
Email = 1,
Post = 2,
SMS = 3,
Telephone = 4
}
}
私のビューには、レンダリングする次のコードがありますCheckBoxList
:
@for (int i = 0; i < Model.MarketingCodes.Count(); i++)
{
var name = @Model.MarketingCodes[i].name.ToString();
<label for="@Model.MarketingCodes[i].name" class="checkbox inlineblock">
@Html.CheckBoxFor(model => model.MarketingCodes[i].selected, new { name = @Model.MarketingCodes[i].name.ToString(), @id = @Model.MarketingCodes[i].name.ToString() }) **@* This works totally fine, even if you click the label, the checkbox will be checked. *@**
@Model.MarketingCodes[i].name
</label>
}
ご覧のとおり、は選択したプロパティにバインドされていますが、をクリックCheckBoxes
しても true に更新されません! CheckBox
単一のCheckBox
. しかし、ループを使用しているためMarketingCodes
、コントローラーでプロパティの値を読み取ると機能しません。選択したすべてのプロパティは false です。
UI から値をフェッチするコントローラー コード:
フォームが投稿されたときに が値を保持していなかったため、index get メソッドが起動したとき、および post メソッドが起動したときに呼び出すこのプライベート関数を作成しました。そして、これは、選択したすべてのプロパティが false に設定されているポイントだと思います。viewmodel
private static void BindMarketingOptions(PersonalDetailsIndexViewModel viewModel)
{
viewModel.MarketingCodes = new[] {
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Email, Line= "line1", value="value1" },
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Post, Line= "line2", value="value2" },
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.SMS,Line= "line3", value="value3" },
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Telephone, Line= "line4", value="value4" }
}.ToList();
}
上記の方法を次のように変更して、選択したプロパティを機能させました。
private static void BindMarketingOptions(PersonalDetailsIndexViewModel viewModel)
{
if (viewModel.MarketingCodes == null)
{
viewModel.MarketingCodes = new[] {
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Email, Line= "line1", value="value1"},
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Post, Line= "line2", value="value2"},
new Bike.ViewModels.MarketingCode { name = AQuoteBike.ViewModels.MarketingCode.MarketingOptionCode.SMS,Line= "line3", value="value3"},
new Bike.ViewModels.MarketingCode { name = Bike.ViewModels.MarketingCode.MarketingOptionCode.Telephone, Line= "line4", value="value4"}
}.ToList();
}
for (var i = 0; i < viewModel.MarketingCodes.Count(); i++)
{
viewModel.MarketingCodes[i].selected = viewModel.MarketingCodes[i].selected;
}
}
BindMarketingOptions(viewModel);
for (var i = 0; i <= viewModel.MarketingCodes.Count(); i++)
{
UserField userField = new UserField();
if (viewModel.MarketingCodes[i].selected) //<--FALSE FOR ALL THE CHECKBOXES
{
userField.Line = viewModel.MarketingCodes[i].Line;
userField.Type = viewModel.MarketingCodes[i].name.ToString();
userField.Value = viewModel.MarketingCodes[i].value;
BikeQuote.BikeRisk.UserFields.Add(userField);
}
}