demoshop

demo, trying to be the best_

我們在製作網頁的時候一定會有不少重複的頁面,以往我們可以利用UserControl來處理在MVC內也有不過不是稱為UserControl我們叫它 Partialview ,如果只是載入重複的靜態頁面當然是很容易的,但往往我們需要判斷這PartialView是被誰呼叫的來動態改變一些顯示值,如果只是判斷網址已經不符合ASP.NET MVC的玩法,因為他本來就帶有一個強大的url重寫機制,呈現的網址不一定是真的,因此我們要判斷的來源一定必須要從Controller和Action來下手。

很簡單得來介紹一下因為這種需求通常屬於 〔顯示邏輯〕因此demo經常性的把它寫在 View 內,在 View 的前面這樣子寫

<%string CurrentAction = ViewContext.RouteData.Values["action"].ToString();%>
<%string CurrentController = ViewContext.RouteData.Values["controller"].ToString();%> 

後續就可以利用以下的 Code 來判斷是否為 某一個 Action

<%if (CurrentAction == "News")
     {%>
       <%=Html.ImageLink("Index", "~/Images/icon01.gif", "", new { controller = "ooxx" })%>
<%  }%> 

 


當然這樣子寫是可以達到我們的需求沒錯,但對於經常性的判斷 demo 還是建議各位寫成一個 Helper 來處理, View 才不會顯得太亂

using System;
using System.Web.Mvc;
 
namespace Helpers
{
    public static class IsCurrentActionHelper
    {
 
        public static bool IsCurrentAction(this HtmlHelper helper, string actionName, string controllerName)
        {
            string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
            string currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
 
            if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase))
                return true;
 
            return false;
        }
        public static bool IsCurrentPage(this HtmlHelper helper, string actionName, string controllerName, string IdName)
        {
            string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
            string currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
            string currentIdName = (string)helper.ViewContext.RouteData.Values["id"];
            if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase) &&
                currentIdName.Equals(IdName, StringComparison.CurrentCultureIgnoreCase))
                return false;
 
            return true;
        }
    }
} 

上面這段 code 因為 demo 需求要判斷出某一頁面才要處理的部份,因此多加上了對於 id 的判斷,這樣就可以準確的判斷出是否為同一頁。


在 ASP.NET MVC 的架構下,我們不免還是需要在 View 內寫 Code ,有些人認為這樣很亂或是很髒,demo的想法是〔顯示邏輯〕本來就應該出現在 顯示(View)內,所以這樣寫沒什麼不妥,而且當你知道此類型的判斷式會重複遇到的時候,就應該要把它寫成 Helper 養成這好習慣是絕對有利的。

回應討論