国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ASP.NET Core】MVC過濾器:常見用法

這篇具有很好參考價值的文章主要介紹了【ASP.NET Core】MVC過濾器:常見用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前面老周給大伙伴們演示了過濾器的運行流程,大伙只需要知道下面知識點即可:

1、過濾器分為授權過濾、資源訪問過濾、操作方法(Action)過濾、結果過濾、異常過濾、終結點過濾。上一次咱們沒有說異常過濾和終結點過濾,不過老周后面會說的。對這些過濾器,你有印象就行了。

2、所有過濾器接口都有同步版本和異步版本。為了讓伙伴不要學得太累,咱們暫時只說同步版本的。

3、過濾器的應用可以分為全局和局部。全局先運行,局部后運行。全局在應用程序初始化時配置,局部用特性類來配置。

4、實際應用中,我們不需要實現所有過濾器接口,需要啥就實現啥即可。比如,你想在 Action 調用后修改一些東西,那實現?IActionFilter 接口就好了,其他不用管。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-747866.html

本篇咱們的重點在于“用”,光知道是啥是不行的,得拿來用才是硬道理。

我們先做第一個練習:阻止控制器的參數從查詢字符串獲取數據。

什么意思呢?咱們知道,MVC 在模型綁定時,會從 N 個 ValueProvider 中提取數據值,包括 QueryString、Forms、RouteData 等。其中,QueryString 就是URL的查詢字符串。比如,咱們寫一個這樣的控制器:

public class GameController : ControllerBase
{
    [HttpGet("game/play")]
    public string Play(Game g)
    {
        if(ModelState.IsValid == false)
        {
            return "你玩?zhèn)€寂寞";
        }
        return $"你正在玩{g.Year}年出的《{g.GameName}》游戲";
    }
}

public class Game
{
    /// <summary>
    /// 游戲序列號
    /// </summary>
    public string? GameSerial { get; set; }

    /// <summary>
    /// 游戲名稱
    /// </summary>
    public string? GameName { get; set; }

    /// <summary>
    /// 誰發(fā)行的
    /// </summary>
    public string? Publisher { get; set; }

    /// <summary>
    /// 哪一年發(fā)行的
    /// </summary>
    public int Year { get; set; }
}

這個通過 /game/play?gameserial=DDSBYCL-5K2FF&gamename=伏地魔三世&publisher=無德無能科技有限公司&year=2017 這樣的URL就能傳遞數據給 g 參數。

這里我不做 HTML 頁了,直接通過 MapGet 返回 HTML 內容。

app.MapGet("/", async (HttpContext context) =>
{
    string html = """
    <!DOCTYPE html>
    <html>
        <head>
            <title>試試看</title>
            <style>
                label {
                    min-width: 100px;
                    display: inline-block;
                }
            </style>
        </head>
        <body>
            <div>
                <label for="gserial">游戲序列號:</label>
                <input id="gserial" type="text" />
            </div>
            <div>
                <label for="gname">游戲名稱:</label>
                <input id="gname" type="text" />
            </div>
            <div>
                <label for="pub">發(fā)行者:</label>
                <input type="text" id="pub" />
            </div>
            <div>
                <label for="year">發(fā)行年份:</label>
                <input id="year" type="text"/>
            </div>
            <div>
                <button onclick="reqTest()">確定</button>
            </div>
            <p id="res"></p>

            <script>
                function reqTest() {
                    let serial= document.getElementById("gserial").value;
                    let name = document.getElementById("gname").value;
                    let pub = document.getElementById("pub").value;
                    let year = parseInt(document.getElementById("year").value, 10);
                    let result = document.getElementById("res");
                    const url = `/game/play?gameSerial=${serial}&gamename=${name}&publisher=${pub}&year=${year}`;
                    fetch(url, { method: "GET" })
                        .then(response => {
                            response.text().then(txt => {
                                result.innerHTML = txt;
                            });
                        });
                }
            </script>
        </body>
    </html>
    """;
    var response = context.Response;
    response.Headers.ContentType = "text/html; charset=UTF-8";
    await response.WriteAsync(html);
});

設置響應的 Content-Type 頭時一定要指定字符集是 UTF-8 編碼,這樣可以免去 99.999% 的亂碼問題。向服務器發(fā)送請求是通過 fetch 函數實現的。

比如,咱們在頁面上填寫:

【ASP.NET Core】MVC過濾器:常見用法

然后點一下“確定”按鈕,提交成功后服務將響應:

你正在玩2022年出的《法外狂徒大冒險》游戲

模型綁定的數據是從查詢字符串提取出來的?,F在,咱們寫一個過濾器,阻止 QueryStringValueProvider?提供查詢字符串數據。而?QueryStringValueProvider 實例是由?QueryStringValueProviderFactory 工廠類負責創(chuàng)建的。因此,需要寫一個過濾器,在模型綁定之前刪除?QueryStringValueProviderFactory 對象,這樣模型綁定時就不會讀取 URL 中的查詢字符串了。

于是,重點就落在選用哪種過濾器。關鍵點是:必須在模型綁定前做這項工作。所以,Action過濾器、結果過濾器就別指望了,而且肯定不是授權過濾器,那就剩下資源過濾器了。

咱們寫一個自定義的資源過濾器——?RemoveQueryStringProviderFilter,實現的接口當然是?IResourceFilter 了。

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;

public class RemoveQueryStringProviderFilter : IResourceFilter
{
    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        // 空空如也
    }

    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        var qsValueProviders = context.ValueProviderFactories.OfType<QueryStringValueProviderFactory>();
        if (qsValueProviders != null && qsValueProviders.Any())
        {
            context.ValueProviderFactories.RemoveType<QueryStringValueProviderFactory>();
        }
    }
}

我們要做的事情是在模型綁定之前才有效,所以?OnResourceExecuted 方法不用管,留白即可。在?OnResourceExecuting 方法中,首先用?ValueProviderFactories.OfType<T> 方法找出現有的?QueryStringValueProviderFactory 對象,若找到,用?RemoveType 方法刪除。

把這個過濾器應用于全局。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
    options.Filters.Add<RemoveQueryStringProviderFilter>();
});
var app = builder.Build();

現在,咱們再運行應用程序,輸入游戲信息。

【ASP.NET Core】MVC過濾器:常見用法

點擊“確定”按鈕后,發(fā)現服務未響應正確的內容。

你正在玩0年出的《》游戲

由于無法從查詢字符串中提取到數據,所以返回默認屬性值。為什么不是返回“你玩?zhèn)€寂寞”呢?因為模型綁定并沒有出錯,也未出現驗證失敗的值,只是未提供值而已,即?ModelState.IsValid 的值依然是 true 的。

?

下面咱們看看異常過濾器怎么用。

異常過濾器最好定義為局部的,而非全局。使用局部過濾器的好處是針對性好,全局的話你用一個萬能異常處理好像過于簡單。當然了,如果你的項目可以這樣做,就隨便用。

這里我定義一個局部的異常過濾器,通過特性方式應用到操作方法上。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class CustExceptionFilterAttribute : Attribute, IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        // 看看有沒有異常
        if (context.Exception is null || context.ExceptionHandled)
            return;
        // 有異常哦,修改一下返回結果
        ContentResult result = new();
        result.Content = "出錯啦,伙計。錯誤消息:" + context.Exception.Message;
        // 設置返回結果
        context.Result = result;
        // 標記異常已處理
        context.ExceptionHandled = true;
    }
}

首先,context 參數是一種上下文對象,它在多上異常過濾器間共享實例(你可能實現了很多個異常過濾器)。context.Exception 屬性引用的是異常類對象;注意一個有趣的屬性?ExceptionHandled,它是一個 bool 類型的值,表示“我這個異常過濾器是否已處理過了”。這個有啥用呢?由于上下文是共享的,當你的某個異常過濾器設置了?ExceptionHandled 為 true,那么,其他異常過濾器也可以讀這個屬性。這樣就可以實現:啊,原來有人處理過這個異常了,那我就不處理了。即 A 過濾器處理異常后設置為已處理,B 過濾器可以檢查這個屬性的值,如果沒必要處理就跳過。

下面寫一個控制器,并在方法成員上應用前面定義的異常過濾器。

public class AbcController : ControllerBase
{
    [HttpGet("calc/add"), CustExceptionFilter]
    public int Add(int x, int y)
    {
        int r = x + y;
        if(r >= 1000)
        {
            throw new Exception("計算結果必須在1000以內");
        }
        return r;
    }
}

此處我設定拋出異常的條件是:x、y 相加結果大于或等于 1000。

咱們以 GET 方式調用,URL 為 /calc/add?x=599&y=699,這樣會發(fā)生異常。服務器的響應為:

【ASP.NET Core】MVC過濾器:常見用法

?

最后一個例子是結果過濾器。咱們要實現在響應消息中添加自定義 Cookie。

public class SetCookieResultFilter : IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext context)
    {
        // 不能在這里寫 Cookie
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {
        HttpResponse response = context.HttpContext.Response;
        // 設置Cookie
        response.Cookies.Append("X-VER", "3.0");
    }
}

這里要注意,咱們要寫 Cookie 必須在?OnResultExecuting 方法中處理,不能在?OnResultExecuted 方法中寫。因為當?OnResultExecuted 方法執(zhí)行時,響應消息頭已經被鎖定了,Cookie 是通過 set-cookie 標頭實現的,此時無法修改 HTTP 頭了,寫 Cookie 會拋異常。所以只能在?OnResultExecuting? 方法中寫。

定義一個控制器。

public class DemoController : ControllerBase
{
    [HttpGet("abc/test")]
    public string Work() => "山重水復疑無路";
}

將自定義的結果過濾器添加為全局。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
    options.Filters.Add<SetCookieResultFilter>();
});
var app = builder.Build();

好,試試看。

【ASP.NET Core】MVC過濾器:常見用法

?

到了這里,關于【ASP.NET Core】MVC過濾器:常見用法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 結果過濾器—MVC項目中結果過濾器(Result Filter)使用

    結果過濾器—MVC項目中結果過濾器(Result Filter)使用

    結果過濾器( ResultFilter ),是對執(zhí)行的Action結果進行處理的一種AOP思想,適用于任何需要直接環(huán)繞 View 或格式化處理的邏輯。結果過濾器可以 替換或更改 Action 結果 。在 IActionResult 執(zhí)行的前后執(zhí)行,使用它能夠控制Action的執(zhí)行結果,比如:格式化結果等。需要注意的是,它只

    2024年02月12日
    瀏覽(102)
  • 操作過濾器—MVC中使用操作過濾器實現JWT權限認證

    操作過濾器—MVC中使用操作過濾器實現JWT權限認證

    上一篇文章分享了授權過濾器實現JWT進行鑒權,文章鏈接:授權過濾器—MVC中使用授權過濾器實現JWT權限認證,接下來將用操作過濾器實現昨天的JWT鑒權。 ? 與授權過濾器大部分一樣,只是執(zhí)行的時機和繼承的接口有所不同。操作過濾器是在Action執(zhí)行的前和后進行調用執(zhí)行

    2024年02月13日
    瀏覽(91)
  • 資源過濾器—MVC中使用資源過濾器實現不執(zhí)行Action方法體讀取緩存信息返回

    資源過濾器—MVC中使用資源過濾器實現不執(zhí)行Action方法體讀取緩存信息返回

    上兩篇文章分享了過濾器實現JWT進行鑒權,分別是通過授權過濾器和操作過濾器實現,這兩個過濾器也是最常用的。文章鏈接:授權過濾器—MVC中使用授權過濾器實現JWT權限認證,操作過濾器—MVC中使用操作過濾器實現JWT權限認證,接下來將簡單的談談資源過濾器在MVC中如何

    2024年02月13日
    瀏覽(96)
  • Spring MVC學習筆記,包含mvc架構使用,過濾器、攔截器、執(zhí)行流程等等

    Spring MVC學習筆記,包含mvc架構使用,過濾器、攔截器、執(zhí)行流程等等

    ??????創(chuàng)作不易,各位看官點贊收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java實現的MVC的輕量級Web框架。 官網文檔地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 輕量級,簡單易學。 高效,基于請求和響應的MVC框架。 與Spri

    2024年02月15日
    瀏覽(29)
  • Vue2中過濾器的用法詳解

    Vue2中過濾器的用法詳解

    目錄 一、過濾器的概念 二、過濾器的使用位置 三、過濾器的分類 1、全局過濾器 2、本地過濾器 四、過濾器應用實例 1、使用過濾器實現省略號 2、使用過濾器處理時間戳 五、Vue3中已廢棄過濾器? 過濾器 是vue中的一個特性,作用是用于對文本進行格式化的作用。分為全局過

    2024年02月07日
    瀏覽(16)
  • Spring MVC獲取參數和自定義參數類型轉換器及編碼過濾器

    Spring MVC獲取參數和自定義參數類型轉換器及編碼過濾器

    目錄 ? 一、使用Servlet原生對象獲取參數 1.1?控制器方法 1.2?測試結果 二、自定義參數類型轉換器 2.1?編寫類型轉換器類 2.2?注冊類型轉換器對象? 2.3?測試結果? 三、編碼過濾器 3.1?JSP表單 3.2?控制器方法 3.3?配置過濾器 3.4 測試結果? 往期專欄文章相關導讀? 1. Maven系列專

    2024年02月10日
    瀏覽(31)
  • 【uniapp/uview】u-datetime-picker 選擇器的過濾器用法

    【uniapp/uview】u-datetime-picker 選擇器的過濾器用法

    引入 :要求日期選擇的下拉框在分鐘顯示時,只顯示 0 和 30 分鐘; 這里引入了 filter = \\\"timeFilter\\\" 作為其配置項; 還補充了開始年份從今年開始的寫法,這樣就可以按照要求來自定義了。

    2024年02月10日
    瀏覽(134)
  • ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應用

    ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應用

    右鍵單擊“視圖”文件夾,然后單擊“添加”“新文件夾”,并將文件夾命名為“HelloWorld”。 右鍵單擊“Views/HelloWorld”文件夾,然后單擊“添加”“新項”。 在“添加新項 - MvcMovie”對話框中: 在右上角的搜索框中,輸入“視圖” 選擇“Razor 視圖 - 空” 保持“名稱”框的

    2024年02月13日
    瀏覽(127)
  • 【python】flask模板渲染引擎Jinja2,流程控制語句與過濾器的用法剖析與實戰(zhàn)應用

    【python】flask模板渲染引擎Jinja2,流程控制語句與過濾器的用法剖析與實戰(zhàn)應用

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年04月11日
    瀏覽(31)
  • ASP.NET Core MVC -- 入門

    ASP.NET Core MVC -- 入門

    ?帶有 ASP.NET 和 Web 開發(fā)工作負載的Visual Studio Visual Studio Code Visual Studio Code 用于 Visual Studio Code 的 C#(最新版本) .NET 7.0 SDK ?ctrl + F5 (開始執(zhí)行,不調試) 在代碼工作區(qū)間文件夾路徑下打開終端運行下面的命令 ?通過運行以下命令來信任 HTTPS 開發(fā)證書: 編譯運行

    2024年02月11日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包