簡體   English   中英

asp.net MVC - 復雜的例子?

[英]asp.net MVC - complex example?

我們正在評估asp.net MVC,並且正在尋找NerdDinner之外的一些更復雜的例子。

具體來說,在一個更復雜的網絡應用程序中,我可能有一個導航欄(包括主導航,搜索框和登錄狀態顯示),主要內容區域,子內容區域(包括相關內容)和頁腳。 在MVC中,控制器返回一個ViewModel(如果我認為我想從我的視圖中取消我的Controller,則不是視圖) - 我的ViewModel是否必須具有覆蓋“頁面”的每個方面的屬性旨在呈現為輸出?

如果不清楚,我可能會重新提出我的問題。

BTW - 我知道這個站點是使用MVC構建的。 我是可下載的例子。

提前致謝。

看看CodeCampServer

編輯:參考你對視圖模型的查詢,這不是它的完美答案,但我想我會引起人們對AutoMapper (CodeCampServer使用)的注意,它可以幫助在模型和視圖模型之間自動映射數據,這是真實的省時間。 還值得考慮輸入構建器的概念( MVCContribASP.NET MVC 2中的一些可用),這也將通過封裝通用功能來減少必須傳遞到視圖中的數據量。

ASP.NET MVC 2提供了一個很好的視頻: http//channel9.msdn.com/posts/Glucose/Hanselminutes-on-9-ASPNET-MVC-2-Preview-1-with-Phil-Haack-和 - 虛擬 - 斯科特/

你走了:

<% Html.RenderAction<LayoutController>(c => c.SearchBox()); %>
<% Html.RenderAction<LayoutController>(c => c.NavBox(Model)); %>

將它們放在您的主頁,或側欄小部件的特定視圖中,並從您正在處理的控制器/視圖模型中抽象出它們的邏輯。 他們甚至可以讀取當前的RouteData(url / action)和ControllerContext(參數/模型),因為你正在處理這些對象中的環境值 - 並執行完整的ActionMethod請求!

我在這里寫了一篇關於這個鮮為人知的秘密 我還在博客中介紹了它的位置,這是ASP.NET 1.0 MVC Futures程序集 ,它是Microsoft獨立的附加程序。

史蒂夫桑德森實際上給出了一個復雜的邏輯和應用程序構建的例子我在一本書中稱為Pro ASP.NET MVC (無恥的插件,我知道,但這是你在你的問題中尋找的),他實際上使用了RenderAction! 在我讀完這本書之前,我寫了這篇博文,所以我很高興我們在同一頁上。

實際上,ASP.NET MVC團隊開發了許多擴展和功能,這些擴展和功能被排除在ASP.NET MVC 1.0項目之外 - 其中大部分都使復雜項目更易於管理。 這就是為什么更復雜的例子(在大多數人的答案中列出)必須使用某種類型的自定義ViewEngine,或者使用基本控制器和自定義控制器的一些大箍跳。 我看了幾乎所有上面列出的開源版本。

但它歸結為不是看一個復雜的例子,而是知道實現你想要的復雜邏輯的方法 - 比如你所擁有的導航欄就是單個控制器中的ViewModel來處理。 很快就必須將導航欄綁定到每個ViewModel。

所以,這些的一個例子是Html.RenderAction()擴展(當我開始時),它允許你從視圖模型/控制器(它甚至不是你關心的地方)移動那個更復雜/抽象的邏輯,並且放置它在它自己的控制器動作中屬於它。

這個小寶寶已經為我保存了MVC,特別是我正在進行的大型企業項目。

你可以將你的viewmodel傳遞給RenderAction,或者只渲染像Footer或Header區域這樣的東西 - 讓邏輯包含在你可以解雇和忘記的那些動作中(編寫RenderAction,忘記它對它做什么的任何關注)對於頁眉或頁腳)

歡迎您來看看good.codeplex.com

它有很多你在上面尋求的東西,但還有工作要做! 但是,在你看完之后,我很樂意在這里或者在codeplex上提出問題。

這就是mygoodpoints.org目前正在運行的內容。

我的ViewModel是否必須具有屬性來覆蓋我想要作為輸出呈現的“頁面”的每個方面?

是。 RenderAction還有另一個選項,但除此之外,一般來說ViewModel通常很大,你必須找到一個很好的方法來填充它。 我承認這聽起來像是一個麻煩點。

AtomSite是使用ASP.NET MVC編寫的博客引擎

據我所知,Controller直接返回一個View,可以使用ViewData或Context將數據傳遞給View。

前者只是各種數據的松散包,而后者是特定類型。

ViewModel將作為Context傳遞給View(並且View的標記將強烈類型化為它所期望的ViewModel類型)。

這是我的2c價值:)希望有所幫助 - 抱歉,我不能包含任何可下載的示例。

要自動將數據傳遞給所有視圖,您可以創建自己的控制器類並使用它:

    public class MyController : Controller

{
    private User _CurrentUser;

    public User CurrentUser
    {
        get
        {
            if (_CurrentUser == null)
                _CurrentUser = (User)Session["CurrentUser"];
            return _CurrentUser;
        }
        set
        {
            _CurrentUser = value;
            Session["CurrentUser"] = _CurrentUser;
        }
    }

    /// <summary>
    /// Use this override to pass data to all views automatically
    /// </summary>
    /// <param name="context"></param>
    protected override void OnActionExecuted(ActionExecutedContext context) 
    {
        base.OnActionExecuted(context);

        if (context.Result is ViewResult) 
        {
            ViewData["CurrentUser"] = CurrentUser;
        }
    }
    }

暫無
暫無

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

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