3

これは、Contoso University のオンライン サンプルのコードです。

コントローラ:

    [HttpGet]
    public ActionResult Edit(int id)
    {
        Department department = departmentService.GetById(id);
        PopulateAdministratorDropDownList(department.PersonID);
        return View(department);
    }

     // POST: /Department/Edit/5
     [HttpPost]
     public ActionResult Edit(Department department)
     {
       try
        {
            if (ModelState.IsValid)
            {
             departmentService.Update(department); 
             return RedirectToAction("Index");
            }
        }
        catch (DataException)
        {
           //Log the error (add a variable name after DataException)
           ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem 
               persists, see your system administrator.");
        }
        PopulateAdministratorDropDownList(department.PersonID);
        return View(department);
     }


     private void PopulateAdministratorDropDownList(object selectedAdministrator = null)
     {
         var administrators = instructorService.GetAll().OrderBy(i => i.LastName);
         ViewBag.PersonID = new SelectList(administrators, "PersonID", "FullName",    
             selectedAdministrator);
     }

意見:

<div class="editor-field">
        @Html.DropDownList("PersonID", String.Empty)
        @Html.ValidationMessageFor(model => model.PersonID)
</div>

私の質問は、ビューでViewBag.PersonIDにアクセスしていない場合(デフォルトで選択された値なしで、ID = "PersonID"のhtml選択リストを生成するDropDownListを作成するだけです)、ViewBag. PersonID プロパティはその DropDownList にバインドされていますか? 舞台裏で何が起こっているのですか?これは魔法のように見えます!!!

2 番目の質問は、データを投稿するときです。コントローラは、ID がモデル内のプロパティと一致する html フォーム フィールドをビューで検索すると思います。ビュー コードがモデルを参照しない (model => model.PersonID のようなもの) ですよね?

4

1 に答える 1

1

舞台裏:

これはnullをチェックし、そうであれば、渡された名前に一致するキーのビューデータをチェックするという魔法の部分を実行する呼び出しを呼び出しますHtml.DropdownList(this HtmlHelper htmlHelper, string name, string optionLabel)SelectExtensions.SelectInternal(htmlHelper, metadata, optionLabel, expression, selectList, allowMultiple, htmlAttributes1)selectList1SelectExtensions.GetSelectData(htmlHelper, name)

投稿:

ここでの仮定はほぼ正しいですが、フォーム フィールドに加えて、フレームワークはクエリ文字列とルート データ、およびパイプ ラインに接続されているその他の IValueProvider もチェックします。

于 2013-03-07T13:58:15.737 に答える