ASP.NET MVC Controller Context

2023-08-22

筆記關於 ASP.NET MVC 5 Controller 可以調用的各式 Property,用以存取 Request, Route, HttpContext, User, TempData 等的資訊 😙

logo

說明

Property Type Description
Request.QueryString NameValueCollection 儲存 URL 查詢字串參數,從 URL 中擷取參數值
Request.ServerVariables NameValueCollection 包含伺服器相關的變數,如 HTTP 標頭和伺服器路徑
Request.Form NameValueCollection 存取 POST 資料,例如表單提交的數據
Request.Headers NameValueCollection 儲存 HTTP 請求的標頭信息,如 User-Agent 和 Content-Type
Request.Params NameValueCollection 包含請求中的所有參數,包括 QueryString、Form 和 Cookies
Request.Cookies HttpCookieCollection 處理客戶端傳遞的 cookie 資訊
Request.HttpMethod string 表示 HTTP 請求方法,如 GET、POST 等
Request.Url Uri 包含完整的請求 URL 資訊,可獲取主機、路徑等資訊
Request.UserHostAddress string 獲取用戶端的 IP 位址,識別訪問者
RouteData.Route RouteBase 表示處理請求的路由配置
RouteData.Values RouteValueDictionary 儲存路由中的參數值,如 Controller、Action 等
HttpContext.Application HttpApplicationState 提供應用程式級別的全域變數,供所有用戶共享
HttpContext.Cache Cache 快取資料,提升應用程式的效能
HttpContext.Items IDictionary 允許在同一個 HTTP 請求的多個部分間共享資料
HttpContext.Session HttpSessionStateBase 提供用戶特定的會話資料儲存,跨頁面保持狀態
User IPrincipal User 的安全性和識別信息
TempData TempDataDictionary 臨時儲存在連續請求間共用的資料

另外也可以藉由以下 Code,顯示所有的 Property Name, Type 以及 Value:

Controller.cs

public ActionResult CustomServerInfo()
{
    var propertyTypes = new Dictionary<string, Dictionary<string, Tuple<Type, object>>>();

    foreach (var current in new List<object> { 
        Response, Request, HttpContext, RouteData, User, TempData, ViewBag, Session, HttpContext.Application,
        User.Identity, Request.Cookies.AllKeys, Request.ServerVariables.AllKeys })
    {
        var tempDict = new Dictionary<string, Tuple<Type, object>>();
        PropertyInfo[] properties = current.GetType().GetProperties();

        foreach (PropertyInfo property in properties)
        {
            if (property.Name != "Item")
            {
                tempDict.Add(property.Name, new Tuple<Type, object>(property.PropertyType, property.GetValue(current, null)));
            }
        }

        propertyTypes[current.GetType().Name] = tempDict;
    }

    return View(propertyTypes);
}

View.cshtml

@model Dictionary<string, Dictionary<string, Tuple<Type, object>>>

@{
    ViewBag.Title = "CustomServerInfo";
}

@foreach (var current in Model)
{
<h2>
    @current.Key
</h2>
<table class="table table-bordered">
    <tr>
        <th>Key</th>
        <th>Type</th>
        <th>Value</th>
    </tr>
    @foreach (var property in current.Value)
    {
        <tr>
            <td>@property.Key</td>
            <td class="@(property.Value.Item1.ToString() == "System.String" ? "text-primary" : "")">
                @property.Value.Item1
            </td>
            <td>@property.Value.Item2</td>
        </tr>
    }
</table>
}