0

私は妻のためにウェブサイトを作成します。彼女は教師であり、生徒のために演習を作成する可能性を持ちたいと考えています。たとえば、彼女が次の演習を作成したい場合があります。

演習1:正しい単語を使用して文を埋めます。

  1. 私の妻は30歳です.............
  2. 私はこの街に30年間住んでいます........。

私は次のモデルを持っています:

public class Exercise
       {
           [Key]
           public Guid Id { get; set; }

           public string Name { get; set; }

           public string Description { get; set; }

           public ExerciseType Type { get; set; }

           public DifficulityLevel DifficulityLevel { get; set; }

           public List<ExerciseItem> Items { get; set; }

           public DateTime TimeOfCreation { get; set; }

           public DateTime TimeOfModification { get; set; }

       }

public class ExerciseItem
    {
        [Key]
        public Guid Id { get; set; }

        public string Content { get; set; }

        public List<ExerciseItemOption> Options { get; set; }

        public ExerciseItemOption CorrectSelection { get; set; }

    }

演習用のビューを作成します。名前、説明、難易度、タイプなどの基本的なプロパティを入力できます。次に、「運動項目を追加」ボタンを作成したいと思います。クリックすると、部分的なビュー(または他の何か)が動的に追加され、新しいExerciseItemを提供できるようになります。私はフォローしようとしました:ボタンを追加しました

@Ajax.ActionLink("Add exercise item", 
                        "AddExerciseItem",
                        "Exercise", new AjaxOptions() { HttpMethod="GET", InsertionMode = InsertionMode.InsertBefore, UpdateTargetId="ExerciseItems"})

および適切なdiv:

<div id="ExerciseItems"></div>

私のアクションメソッドは次のようになります。

public ActionResult AddExerciseItem()
        {
            return PartialView("ExerciseItem", new ExerciseItem());
        }

および部分ビュー:

@model ElangWeb.Models.ExerciseItem
<fieldset>
    <legend>ExerciseItem</legend>

    @Html.HiddenFor(model => model.Id)

    <div class="editor-label">
        @Html.DisplayNameFor(model => model.Content)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Content, new { style = "width:200px" })
    </div>
</fieldset>

正常に動作します。ただし、ボタンをクリックして演習全体を作成すると、モデルにExerciseItemコレクションがありません。

public ActionResult Create(Exercise exercise)
        {
            using (PersistanceManager pm = new PersistanceManager())
            {
                exercise.Id = Guid.NewGuid();
                exercise.TimeOfCreation = DateTime.Now;
                exercise.TimeOfModification = DateTime.Now;
                pm.ExcerciseRepository.Add(exercise);
            }
            return RedirectToAction("Index");
        }

追加したExerciseItemオブジェクトのリストをモデルExerciseにバインドするには、コードをどのように変更する必要がありますか?

4

1 に答える 1

1

モデルバインディングに関するこの記事を確認してください。基本的に、エクササイズアイテムに特別な名前を付けて、正しくバインドされるようにする必要があります。

例:部分的:

@model ElangWeb.Models.ExerciseItem
<fieldset>
    <legend>ExerciseItem</legend>
    <label>content</label>
    <input type="hidden" name="ExcersiseItem.Index" value="SomeUniqueValueForThisItem" />
    <input type="text" name="ExcersiseItem[SomeUniqueValueForThisItem].Name" value="@Model.Content" />
</fieldset>    

この質問に対する私の回答MVC3Non-SequentialIndicesとDefaultModelBinderもご覧ください。それを見つけてくれてありがとうYarx、私は実際にそれを見つけようとしていました:)

于 2013-01-24T22:26:29.483 に答える