導航:首頁 > 凈水問答 > mvc過濾器執行順序

mvc過濾器執行順序

發布時間:2021-03-26 00:49:07

1. MVC4 過濾器使用和怎樣控制全部action和部分action

讓一個中的所有Action都執行這個過濾器就需要對裡面的方法進行重寫

public class LoginController : Controller
{
//
// GET: /Login/
public ActionResult Index()
{
return View();
}

public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
//if (attrs.Length == 1)//有NoFilter屬性
//{
// return;
//}

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
}

View Code
這樣每個action在執行前都會先執行這個過濾器。
下面是怎樣讓Index的Action不執行,只是對Login執行。有2種方式實現:
第一種:代碼修改如下:

public class LoginController : Controller
{
//
// GET: /Login/
[NoFilter]
public ActionResult Index()
{
return View();
}

public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//過濾掉標有NoFilter標簽的Action
object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
if (attrs.Length == 1)//有NoFilter屬性
{
return;
}

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
}
public class NoFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//
}
}

View Code
第二種:代碼修改如下:

public class LoginController : Controller
{
//
// GET: /Login/
public ActionResult Index()
{
return View();
}
[LoginFilter]
public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
//protected override void OnActionExecuting(ActionExecutingContext filterContext)
//{
// //過濾掉標有NoFilter標簽的Action
// object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
// if (attrs.Length == 1)//有NoFilter屬性
// {
// return;
// }

// string name = filterContext.HttpContext.Request["UserName"];
// if (string.IsNullOrEmpty(name))
// {
// filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
// filterContext.HttpContext.Response.End();
// }
//}
}
public class LoginFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//
}
}

View Code
補充:1.自定義過濾器Filter必須繼承FilterAttribute。
2.定義過個過濾器可以定義過濾器執行的先後順序 例如: 在Action上標注:
[NoFilter(Order=2)]
[LoginFilter(Order=1)]
這樣當執行這個Action時候會先執行LoginFilter 再執行NoFilter。

2. C# MVC Filter過濾器如何停止往下執行

你這是開發mvc可不是開發asp,什麼年代了還Response.Write呢?

設置filterContext的Result為一個ViewResult來阻止執行Action

3. c#mvc過濾器有哪幾種,應用場景是什麼

mvc裡面的model通常稱為viewmodel 顧名思義用來與view做交互的 三層里的model通常與資料庫欄位保持一版致 在三層里用來與資料庫和業務層權做交互 兩者都是實體類 DAL操作資料庫封裝成一個model 向上傳遞至BLL 然後在mvc中將model轉換為viewmodel供vi

4. 像asp.net mvc 過濾機制一樣,執行操作方法之前後 先調用其它方法 用C#如何實現

5分還具體...........

建個類,繼承FilterAttribute就行了.......

5. spring mvc攔截器 和 過濾器哪個先執行

先執行filter,只有限制性過濾器之後才可以進入容器執行攔截

6. SpringMVC的攔截器和過濾器的區別與聯系

首先給介紹下過濾器和攔截器的區別:
(1)攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
(2)攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
(3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
(4)攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
(5)在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
(6)攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,
可以調用業務邏輯。
然後進行分析下:
1.過濾器是JavaEE標准,採用函數回調的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處
理,並且在請求結束返回給前端這之間進行後期處理。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}

chain.doFilter(request, response);這個方法的調用作為分水嶺。事實上調用Servlet的doService()方法是在
chain.doFilter(request, response);這個方法中進行的。

2.攔截器是被包裹在過濾器之中的。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}

a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在
[System.out.println("before...")][chain.doFilter(request, response)]之間執行。
b.preHandle()方法之後,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。
c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)]
[System.out.println("after...")]之間執行。
3.SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法
中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的如下圖:

7. MVC過濾器,怎麼排除某個Action不使用Controller下的過濾器

當ActionInvoker在執行目標Action方法之前,會根據Order和Scope屬性對用於封裝ActionFilter的Filter對象進行排序。
然後根據當前ControllerContext和ActionDescriptro創建一個ActionExecutingContext對象,並將其作為參數依次調用所有ActionFilter的OnActionExecuting方法。
在這之後真正的目標Action方法被執行,ActionInvoker隨後執行後續的篩選操作。具體來說,它根據當前ControllerContext、ActionDescriptro以及Action方法執行過程中拋出的異常創建一個ActionExecutedContext對象。該ActionExecutedContext的Cancel屬性為False,如果Action方法返回一個ActionResult對象,該對象將會作為該ActionExecutedContext的Result屬性。
接下來按照相反的次序依次調用ActionFilter對象的OnActionExecuted方法,執行過程中的ActionFilter可以修改ActionExecutedContext的Result屬性。當整個ActionFilter鏈執行結束之後,ActionExecutedContext的Result屬性返回的ActionResult將會作為對當前請求的響應。右圖基本上反映了連同目標Action在內的整個ActionFilter鏈的執行過程。

8. php的MVC框架中,語句執行順序問題,新手,求解答

正常來說樓主想的邏輯的對的,window.location.href="";應該是你這個寫錯了;下面是我寫的,完全是當alert彈框點擊確認之後,才執行的跳轉。
<script>
alert('111');
window.location.href='2.html';
</script>

9. MVC執行順序

MVC在底層和傳統的asp.net是一致的,在底層之上,相關流程如下:
1)Global.asax里,MvcApplication對象的Application_Start()事件中,調用 RouteConfig.RegisterRoutes(RouteTable.Routes); 來注冊路由規則。
2)RouteConfig.RegisterRoutes()方法里,給出的默認規則為{controller}/{action}/{id} .
a. 在有特別需要的時候,到這里來修改規則。
b. 未指明Controller默認為HomeContoller,未指定Action默認為Index, 也就是說,直接訪問站點時,會默認導航到HomeController下的Index Action.
c. Action後跟的內容會被映射為名為id的參數。 比如: User/Delete/1 會匹配到 UserController的 Delete(int id) 方法。
d. Action分為[HttpGet]和[HttpPost]兩種,與HTTP的GET和POST方式對應。 即直接請求的URL只會匹配[HttpGet]方法,而未註明[HttpPost]的方法即默認為[HttpGet]. Post的Action一般會有一個Model參數,MVC會自動將表單里的數據按約定的規則填充到Model實體對象里。 這個約定的規則,就是表單的Name與屬性名稱有個對應規則。
3)MVC負責按上述規則將執行流程導入合適的Action中,即Controller的某個方法中。
4)Action中,可以直接返回字元串,輸出到瀏覽器, 也可以返回到ActionResult對象, 該對象指向一個View頁面,並且附帶了一些屬性作為傳遞數據的容器。

10. MVC 過濾器

因為是調試模式,Debug是開啟的,如果是以Release方式就應該可以了

這不算問題

閱讀全文

與mvc過濾器執行順序相關的資料

熱點內容
哪款蒸餾水敷臉比較好 瀏覽:879
印染廢水調節ph怎麼弄 瀏覽:916
奇駿換汽油濾芯多少公里換 瀏覽:491
生活污水主要含有什麼成份 瀏覽:557
法蘭妮凈水器怎麼樣 瀏覽:211
洗菜盆兒凈水器溢水口不用怎麼辦 瀏覽:803
淋浴頭被水垢堵 瀏覽:415
污水站排風每小時次數 瀏覽:450
河南污水處理行業研究 瀏覽:621
污水泵發熱了怎麼處理 瀏覽:855
帥鈴皮卡空調濾芯在哪裡 瀏覽:943
污水處理廠用地搬遷後住宅 瀏覽:842
汽車蒸餾水位置在哪 瀏覽:644
小米凈化器2怎麼解鎖 瀏覽:40
凈水器雙膜和ro膜 瀏覽:914
蒸餾東莨菪鹼 瀏覽:607
龍派凈水器多少錢呀 瀏覽:115
離子交換法處理方法 瀏覽:31
怎麼測試凈水機的凈水效果 瀏覽:489
寧波混凝土樹脂磨片專賣店 瀏覽:281