2

次の [HttpGet] Create() メソッドがあります。

    public ActionResult Create(int? parentId)
    {
        var model = new CreatePersonViewModel();

        // pull parent from db
        var parent = _db.Persons.FirstOrDefault(s => s.Id == parentId);

        model.Parent = parentSet;

        return View("Create", model);
    }

別の人の詳細ページから新しい Person を作成する場合は、その親 Person の ID を渡し、Parent を含む viewModel を作成します。

POST は次のようになります。

 [HttpPost]
    public ActionResult Create(CreatePersonViewModel viewModel)
    {
        if (ModelState.IsValid)
        {

            var parent = viewModel.Parent;  // This is always null for some reason

            var person = new Person() { Name = viewModel.Name };

            // if it has a parent, build new relationship
            if (parent != null)
            {
                person.Parent = parent;
                parent.Children.Add(person);
            };

            _db.Save();

            return RedirectToAction("detail", "person", new { personId = person.Id });
        }
        return View(viewModel);
    }

何らかの理由で、POST メソッドにプッシュバックされる viewModel には、GET コントローラー メソッドで定義された Parent が決して含まれません。親の非表示フィールドでビューを混乱させることなく、MVC に親を GET から POST にプッシュするように指示するにはどうすればよいですか?

それが役立つ場合に備えて、私の見解は次のとおりです。

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

    <fieldset>
        <legend>CreatePersonViewModel</legend>

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

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

2 に答える 2

2

コントローラー アクションは、HTML フォームに明示的に含まれているデータのみを受け取ります。

親オブジェクトを受け取りたい場合は、非表示の<input>タグに配置する必要があります。

クライアントから送信されるデータは、攻撃者によって完全に制御されており、信頼できないことに注意してください。

于 2013-02-17T03:36:52.617 に答える