Asp.NetMVCにおけるViewDataとViewBagの使い方

10275 ワード

MVCの開発では常にViewDataやViewBagを用いて値を伝える操作が行われていますが、よく使われているのでここでまとめてみて、後世の人に便利です.

一、ViewBagの使用方法


バックグラウンドコード:
public ActionResult Index()
{
    Dictionary<string, string> address = new Dictionary<string, string>();
    address.Add("Lng", "12.353535");
    address.Add("Lat", "28.262626");
    address.Add("Location", "     ");
    List<string> modules = new List<string>();
    modules.Add("Admin module");
    modules.Add("Recursive module");
    modules.Add("Consistent module");
    ViewBag.Name = "  ";
    ViewBag.Age = "18";
    ViewBag.Phone = "18233199999";
    ViewBag.Address = address;
    ViewBag.Modules = modules;
    return View();
}

フロントコード:バックグラウンドはViewBagで値を保存し、フロントはViewBagで値を取ることもできるし、ViewDataで値を取ることもできる.ViewDataを使用して値を取る場合は、データを適切なタイプに変換する必要があります.ViewBagを使用して値を取得する場合は、データ型を変換する必要はありません.
@ViewData["Name"]
@ViewData["Age"]
@ViewData["Phone"]
@{
    Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
}
@if (dict != null)
{
    @dict["Lng"]
    @dict["Lat"]
    @dict["Location"]
}
@{
    List<string> list = ViewData["Modules"] as List<string>;
}
@if (list != null)
{
    @list[0]
    @list[1]
    @list[2]    
}

@ViewBag.Name @ViewBag.Age @ViewBag.Phone @ViewBag.Address @ViewBag.Address["Lng"] @ViewBag.Address["Lat"] @ViewBag.Address["Location"] @ViewBag.Modules @ViewBag.Modules[0] @ViewBag.Modules[1] @ViewBag.Modules[2]

二、Viewデータの使用方法


バックグラウンドコード:
public ActionResult Index()
{
    Dictionary<string, string> address = new Dictionary<string, string>();
    address.Add("Lng", "12.353535");
    address.Add("Lat", "28.262626");
    address.Add("Location", "     ");
    List<string> modules = new List<string>();
    modules.Add("Admin module");
    modules.Add("Recursive module");
    modules.Add("Consistent module");
    ViewData["Name"] = "  ";
    ViewData["Age"] = "18";
    ViewData["Phone"] = "18233199999";
    ViewData["Address"]=address;
    ViewData["Modules"] = modules;
    return View();
}

フロントコード:バックグラウンドはViewDataで値を保存し、フロントはViewBagで値を取ることもできるし、ViewDataで値を取ることもできる.ViewDataを使用して値を取る場合は、データを適切なタイプに変換する必要があります.ViewBagを使用して値を取得する場合は、データ型を変換する必要はありません.
@ViewData["Name"]
@ViewData["Age"]
@ViewData["Phone"]
@{
    Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
}
@if (dict != null)
{
    @dict["Lng"]
    @dict["Lat"]
    @dict["Location"]
}
@{
    List<string> list = ViewData["Modules"] as List<string>;
}
@if (list != null)
{
    @list[0]
    @list[1]
    @list[2]    
}

@ViewBag.Name @ViewBag.Age @ViewBag.Phone @ViewBag.Address @ViewBag.Address["Lng"] @ViewBag.Address["Lat"] @ViewBag.Address["Location"] @ViewBag.Modules @ViewBag.Modules[0] @ViewBag.Modules[1] @ViewBag.Modules[2]

三、両者の定義


ViewBagの定義:
public dynamic ViewBag {  
    get {  
        if (_dynamicViewData == null) {  
            _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);  
        }  
        return _dynamicViewData;  
    }  
}

ViewDataの定義:
public ViewDataDictionary ViewData {  
    get {  
        if (_viewData == null) {  
            SetViewData(new ViewDataDictionary());  
        }  
        return _viewData;  
    }  
    set {  
        SetViewData(value);  
    }  
}

定義により,ViewBagはViewDataの動的パッケージングであり,ViewDataに基づいてパッケージング処理を行ったことに相当する.

四、両者の違い

  • ViewDataはディクショナリタイプで、付与方式はディクショナリ方式で、key値で対応するvalueを読み出し、ViewData["myName"]
  • ViewBagはダイナミックタイプで、使用時に直接属性で値を付与すればよい、ViewBag.myName
  • ViewDataとViewBagは現在のActionでのみ有効であり、View
  • と同等である.
  • ViewDataとViewBagの値は相互にアクセスできます.注意:1、キーワードが有効なC#識別子である場合にのみ、ViewBagが機能します.たとえば、ViewData["Key With Space"]に値を格納すると、コンパイルできないため、ViewBagを使用してアクセスできません.2、動的値は拡張メソッドにパラメータとして渡すことができません.C#コンパイラは正しい拡張メソッドを選択するために、コンパイル時に各パラメータの本当のタイプを知らなければならないからです.いずれかのパラメータがダイナミックである場合、コンパイルは行われません.例:@Html.TextBox(「name」,ViewBag.Name)はコンパイルに失敗します.この行のコードをコンパイルするには、@Htmlという2つの方法があります.TextBox(“name”,(string)ViewBag.Name) 、@Html.TextBox(“name”,ViewData[“Name”])

  • 五、簡単にまとめる


    未知のものに出会って焦らないでください、今毎日そんなに多くの新しい知識が世に出て、誰もすべての知識点を覚えることができなくて、心を静めて真剣に研究していつもマスターすることができる限り、必ず自分ができることを信じて、自分に制限を設けないでください.