2

LayoutTemple でa を使用しようとしているDropDownListFor<>ため、モデルにアクセスできません。だから私がしたことは、@{}追加したページの上部にあるブロックで、FFInfo.DAL.SoloClassesContext db = new FFInfo.DAL.SoloClassesContext();使用したいクラスで DBContext のインスタンスを呼び出します。次に、使用したい場所にリストを配置しました

@Html.DropDownListFor(
m => m.ID,
new SelectList(db.CultureCodes, "ID", "DisplayName"));

しかし、コードを実行すると、行のエラーが発生しますm => m.ID。与えられたエラーは次のとおりです。

式ツリーに動的操作が含まれていない可能性があります

私はこのタイプのドロップダウンを使用したことがなく、MVC は初めてです。誰かが私が間違っていることとそれを修正する方法を教えてもらえますか?

4

1 に答える 1

8

あなたのソリューションにいくつかの変更を提案します:

  1. DropDownListFor()ただ使用する代わりにDropDownList()

    @Html.DropDownList("CultureCode", new SelectList(db.CultureCodes, "ID", "DisplayName"))

  2. ビューでデータベースデータにアクセスする代わりに...これは標準から非常に外れており、ビュー(通常は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 回 (ホーム/インデックスなどで) ロードしてから、部分ビューを使用する方が良い方法だと思います。このようにして、レイアウトをリロードしてホームに戻るか、その他のフルビュー呼び出しのみを行います。

于 2013-10-13T14:19:03.327 に答える