簡體   English   中英

在asp.net mvc 5中進一步說明將數據從控制器傳遞到布局子視圖

[英]further clarification about passing data from controller to layout sub view in asp.net mvc 5

我想我有一個非常標准的問題,因為我想將某些數據從asp.net MVC 5控制器傳遞到共享視圖(在我的情況下為導航)。

我有一個模板,在導航共享視圖中顯示用戶名和用戶圖片,因此需要將各自的數據傳遞給它。

我的布局結構:

  • 共享\\布局
  • 共享\\部首
  • 共享\\導航
  • %身體%
  • 共享\\頁腳

布局是主視圖,當然,我還有其他視圖,例如Home \\ Index。 您可以想象,除了登錄/注冊或任何錯誤視圖外,我必須在每個視圖中顯示用戶名及其用戶圖片。 這些視圖完全不使用布局,因此,每次使用布局結構呈現視圖時,用戶都已經登錄。

因此,我正在研究將數據從控制器傳遞到導航視圖的方法,盡管我的控制器返回了索引視圖,並且希望對它們的缺點和用例中的有效選擇進行一些說明:

用例:

我的項目有一個用戶可以訪問的漂亮的MVC應用程序。 一旦他登錄到MVC應用程序,便會根據從中獲取數據的同一個webapi對用戶進行身份驗證,並存儲訪問令牌以及其他用戶詳細信息以供進一步請求。 我不確定在哪里存儲這些數據。 據我了解,選項將是Cookies,會話和本地存儲。 由於我對asp.net,MVC和C#剛起步,所以我還沒有弄清楚如何在MVC應用程序中使用[Authorize]屬性,因此它可以將用戶標記為已通過身份驗證:/我猜這是關鍵問題在於MVC應用程序無權訪問數據庫,因此無法檢查登錄名並填充用戶標識。

如何從控制器傳輸數據到視圖:

ViewBag:將數據傳遞到視圖的最簡單方法。 它不是強類型的,可以在所有視圖中訪問。 有人告訴我使用它是一種不好的做法,並建議使用viewModels。

ViewData:似乎和viewdata一樣。

ViewModel:傳遞給視圖的強類型模型,需要在使用它的任何視圖中聲明。 因此,如果要在導航視圖中使用它,則需要在此聲明它。 這種方法的最大缺點是,每個視圖模型都需要具有一個baseViewModel,因此它們具有共同的結構,這種結構顯然會在以后引起問題,並阻止我繼承其他模型來填充我的viewModelStructure。

Cookies:很明顯,我可以在登錄期間將數據存儲在cookie中,然后在視圖中訪問它們,但是cookie必須存在,因此我將無法將該信息保存在會話或本地存儲中

會話:我也可以在會話中存儲數據,但是當用戶關閉瀏覽器選項卡時,該會話將過期。

LocalStorage:這對我來說是很新的,所以我無法判斷。

用戶身份:我剛剛發現我還可以從Context.User.Identity訪問用戶身份。

像[Authorize]屬性或自定義屬性之類的全局過濾器:如果我正確理解它,使用全局過濾器,我可以在每個控制器操作中自動填充所需的數據,並排除不需要的數據(如登錄/注冊等)。由於我的項目結構,目前還不確定如何應用這種方式(請參見上文)。

RenderAction:我也可以通過RenderAction幫助器方法調用另一個控制器方法,以始終呈現頁面的該部分。

你們如何解決這個問題? 如果您需要更多說明,請詢問。

謝謝 :)

使用基本的ViewModel。 您仍然可以使用繼承在視圖模型中構建功能,就像您所說的那樣,它們都將共享一個通用的基本視圖模型。

我不確定使用此方法會遇到什么問題,但我建議使用強類型化,可維護的視圖模型的好處來彌補這些問題,這些模型可用於所有視圖,包括部分視圖和_Layout

根據您的布局結構開始的建議:

public abstract class ViewModelBase {
    public HeaderViewModel Header {get;}
    public NavigationViewModel Navigation {get;}
    public FooterViewModel Footer {get;}

    public ViewModelBase(HeaderViewModel header, NavigationViewModel navigation, FooterViewModel footer) {
        Header = header;
        Navigation = navigation;
        Footer = footer;
    }
}

public class HeaderViewModel {
    // properties

    public HeaderViewModel(...) {
    }
}

public class NavigationViewModel {
    // properties

    public NavigationViewModel(...) {
    }
}

public class FooterViewModel {
    // properties

    public FooterViewModel(...) {
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM