あなたのソリューションにいくつかの変更を提案します:
DropDownListFor()
ただ使用する代わりにDropDownList()
@Html.DropDownList("CultureCode", new SelectList(db.CultureCodes, "ID", "DisplayName"))
ビューでデータベースデータにアクセスする代わりに...これは標準から非常に外れており、ビュー(通常はHTML)をデータベースと結合しています...クエリをコントローラーに配置し、データをViewBagに配置する必要がありますコレクション。
したがって、レイアウトでは、上記で提案したコードの代わりに、次を使用する必要があります。
@Html.DropDownList("CultureCode", (SelectList)ViewBag.Codes, "Select one...")
コントローラーでは、次のようにロードします。
ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName");
編集:
アクションフィルターを実行して、にロードまたは注入できCultureCodes
ますViewBag
:
public class IncludeCultureCodesAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.Controller;
// IController is not necessarily a Controller
if (controller != null)
{
var db = new YourContext();
controller.ViewBag.Codes = new SelectList(db.CultureCodes, "ID", "DisplayName"));;
}
}
}
次に、コントローラーアクションで... でそれらを飾ることができます[IncludeCultureCodes]
。したがって、その属性を持つアクションは、コードのコレクションをロードします。
しかし、レイアウトを 1 回 (ホーム/インデックスなどで) ロードしてから、部分ビューを使用する方が良い方法だと思います。このようにして、レイアウトをリロードしてホームに戻るか、その他のフルビュー呼び出しのみを行います。