0

私はMVC4を学ぶためにフラッシュカードアプリケーションを構築しようとしています。セットにはカードが含まれ、カードにはサイドが含まれます(片面または多面のカードを容易にするため)。

カード作成用に次のviewModelがあります。

public class CreateCardViewModel
    {
        [HiddenInput(DisplayValue = false)]
        public int SetId { get; set; }

        [Required]
        public ICollection<Side> Sides { get; set; }

        [Required]
        [DataType(DataType.Date)]
        public DateTime DateCreated { get; set; }

        [Required]
        public bool IsReady { get; set; }

    }

そして、作成のために定義された次のアクション:

[HttpGet]
        public ActionResult Create(int setId)
        {
            var model = new CreateCardViewModel();

            // attach card to current set
            model.SetId = setId;

            // create a new Side
            var side = new Side() {Content = "Blank Side"};

            // Add this to the model's Collection
            model.Sides = new Collection<Side> { side };

            return View(model);
        }

        [HttpPost]
        public ActionResult Create(CreateCardViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                var set = _db.Sets.Single(s => s.SetId == viewModel.SetId);
                var card = new Card {Sides = viewModel.Sides};

                set.Cards.Add(card);

                _db.Save();
            }
            return View(viewModel);


        }

ビューでは、コントローラーで作成したサイドを表示し、ユーザーが編集できるようにすることから始めようとしています。「InvalidOperationException:テンプレートは、フィールドアクセス、プロパティアクセス、単一次元配列インデックス、または単一パラメーターのカスタムインデクサー式でのみ使用できます。」というメッセージが表示されます。ビューで次のマークアップを使用して実行しようとすると、次のようになります。

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>CreateCardViewModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.SetId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.SetId)
            @Html.ValidationMessageFor(model => model.SetId)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.DateCreated)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.DateCreated)
            @Html.ValidationMessageFor(model => model.DateCreated)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.IsReady)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IsReady)
            @Html.ValidationMessageFor(model => model.IsReady)
        </div>


        // OFFENDING CODE
        @foreach (var side in Model.Sides)
             {
                 @Html.EditorFor(model => model.Sides.ElementAt(side.SideId))
             }

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

カードを作成するときに、ユーザーに既存のサイドを編集させるにはどうすればよいですか?

4

1 に答える 1

1

を使用する代わりにElementAt()、通常の[]インデックス演算子を使用してください。

@Html.EditorFor(model => model.Sides[side.SideId])

于 2013-02-10T20:09:37.320 に答える