0

できることがあれば、ちょっとした助けやアドバイスはありますか?私は MVC フォームを持っています (実際には Umbraco フォーム/サーフェス コントローラーですが、それがこれに関係していることはわかりません)。このモデルには、HTML ヘルパー メソッドを使用してチェック ボックスを生成するために使用されるオブジェクトのリストが含まれています。 ; これらをレンダリングして子アクションで受け取る方法については、次の投稿を参照してください。

すべてのチェックボックスが送信時に投稿されているにもかかわらず、コントローラーの ActionResult メソッドによって受信されたモデルによってすべてが選択されているわけではないことを除いて、すべてがうまく機能しているようです。Chrome のネットワーク ツールを使用して投稿されたデータを確認しましたが、すべて問題ないように見えます (すべてのチェック ボックスが同じ形式で投稿されているようです)。モデルでピックアップされたいくつかの値?

これは、チェックボックスをレンダリングする私のフォームのスニペットです。残りは関連しないはずなので省略します(実際には送信ボタンがあります..):

@model MemberPreferencesVM
@using (Html.BeginUmbracoForm<MemberAccountSurfaceController>("HandleDealerMemberPreferencesAccountUpdate", FormMethod.Post, new { @class = "", @id = "dealer-member-account-preferences-form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @for (var j = 0; j < Model.Brands.Count; j++)
    {
        if (Model.Brands[j].Division == Model.Divisions[i].Id.ToString())
        {
            var divisionSelected = Model.Divisions.Any(x => x.Id.ToString() == Model.Brands[j].Division) ? Model.Divisions.FirstOrDefault(x => x.Id.ToString() == Model.Brands[j].Division).Checked : false;
            var checkboxAttr = new Dictionary<string, object> { { "class", "styled" }, { "data-division", Model.Brands[j].Division } };
            var brandSelected = Model.Brands[j].Checked;

            <div class="col-xs-4">
                <label class="option @if (divisionSelected && brandSelected){<text>active</text>}">
                    <img src="@(Model.Brands[j].LogoUrl)" class="center-block" alt="@(Model.Brands[j].Name)" />
                    <span class="checkbox">
                        @Html.HiddenFor(model => model.Brands[j].Id)
                        @Html.HiddenFor(model => model.Brands[j].Name)
                        @Html.CheckBoxFor(model => model.Brands[j].Checked, checkboxAttr)
                    </span>
                </label>
            </div>
        }
    }
}

モデルのわずかに縮小されたバージョン:

public class MemberPreferencesVM: IValidatableObject
{
    public MemberPreferencesVM()
    {
        init();
    }
    private void init()
    {
        Divisions = [Logic to fetch divisions];
        Brands = [Logic to fetch brands];
    }
    public IList<DivisionVM> Divisions { get; set; }
    public IList<BrandVM> Brands { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var pDivisions = new[] { "Divisions" };
        var pBrands = new[] { "Brands" };
        if (!Divisions.Any(x => x.Checked))
        {
            yield return new ValidationResult("Select at least 1 division to view by default", pDivisions);
        }
        if (!Brands.Any(x => x.Checked))
        {
            yield return new ValidationResult("Select at least 1 brand to view by default", pBrands);
        }
    }
}

ブランド VM:

public class BrandVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string LogoUrl { get; set; }
    public bool Checked { get; set; }
    public string Division { get; set; }
}

アクション結果:

[ValidateAntiForgeryToken]
[ValidateInput(true)]
[HttpPost]
public ActionResult HandleDealerMemberPreferencesAccountUpdate(MemberPreferencesVM model)
{
    //logic removed as model doesn't arrive will all values so not relevant 
    return CurrentUmbracoPage();
}

モデルには 24 のブランドが含まれている必要がありますが、「HandleDealerMemberPreferencesAccountUpdate」には 12 しか到達していないようです。

助けていただければ幸いです(私が失敗した場所は簡単なものであることを願っています)..

マーク

4

1 に答える 1

0

OK、これは私のデータの問題であることが判明しました。これはあり得ないことです。

上記のStephen Mueckeのコメントは確かに正しかった

for ループ内に if ブロックがあります。それが false と評価される場合は、「インデクサー」をスキップすることを意味し、送信時にバインドが失敗します。デフォルトでは、コレクション インデクサーはゼロから始まり、連続している必要があります。これを機能させるためにインデクサーの入力を追加できますが、ビューに必要なオブジェクトのみを含むビュー モデルを使用する必要があります。

基本的に、私のブランドの 1 つには部門が関連付けられていなかったため、コントローラーに正しくポストされなかったため、ソリューションが機能しなくなりました。これが不可能になるようにコードをリファクタリングする必要がありますが、これが再び起こらないように CMS に変更を加えました。

うまくいけば、これは他の誰かを助けるでしょう、すべてのポインタに感謝します.

于 2016-11-23T10:02:50.923 に答える