0

には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);
                    }
                }
4

2 に答える 2

2

各チェックボックスのプロパティを変更していnameます-これは、デフォルトのモデルバインダーがデータをモデルにバインドしようとするために使用するものです.MVCにそれを生成させるのが最善です.

@for (int i = 0; i < Model.MarketingCodes.Count(); i++)
{
    ...
    Html.CheckBoxFor(model => model.MarketingCodes[i].selected);
    ...
}
于 2013-01-12T11:19:38.703 に答える
0

答えは質問自体に見ることができます。チェックボックスの名前をオーバーライドすることは問題ではありませんでした。代わりに、ラベルの属性がチェックボックスの名前で機能するように名前をオーバーライドしたいと考えています。したがって、ユーザーがラベルをクリックすると、チェックボックスがクリックされます。実際の問題は、データを MarketingCodes プロパティにバインドする方法にありました。旧バージョンと最新バージョンを提供しました。そして、それは今うまくいきます。

于 2013-01-12T13:29:13.447 に答える