2012-08-24 118 views
3

我有一個奇怪的問題。我的觀點:Asp.Net mvc嵌套操作HTTPPOST

我的控制器:

public class DefaultController : Controller 
{ 
    // 
    // GET: /Default1/ 

    [HttpPost] 
    public ActionResult Index(string t) 
    { 
     return View(); 
    } 


    public ActionResult Index() 
    { 
     return View(); 
    } 

    // 
    // GET: /Default1/ 

    [HttpPost] 

    public ActionResult Index2(string t) 
    { 
     return PartialView("Index"); 
    } 

      [ChildActionOnly()] 
    public ActionResult Index2() 
    { 
     return PartialView(); 
    } 
} 

當我點擊一個按鈕[HttpPost]Index(string t)執行,至極的罰款。但之後[HttpPost]Index2(string t)被免除,這對我來說真的很奇怪,因爲我發佈的數據爲Index而不是Index2。我的邏輯告訴我,[ChildActionOnly()]ActionResult Index2()而不是HttpPost之一。

這是怎麼發生的?如何覆蓋此行爲,而無需重命名[HttpPost]Index2操作?

回答

2

這是默認行爲。這是設計。

public class PreferGetChildActionForPostAttribute : ActionNameSelectorAttribute 
{ 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     if (string.Equals("post", controllerContext.HttpContext.Request.RequestType, StringComparison.OrdinalIgnoreCase)) 
     { 
      if (methodInfo.CustomAttributes.Where(x => x.AttributeType == typeof(HttpPostAttribute)).Any()) 
      { 
       return false; 
      } 
     } 
     return controllerContext.IsChildAction; 
    } 
} 

,然後裝點你的兩個動作:如果你不能改變POST Index2動作名稱,即使當前請求是一個POST請求,你可以寫一個自定義的操作名稱選擇,這將迫使GET Index2動作的用法與它:

[HttpPost] 
[PreferGetChildActionForPost] 
public ActionResult Index2(string t) 
{ 
    return PartialView("Index"); 
} 

[ChildActionOnly] 
[PreferGetChildActionForPost] 
public ActionResult Index2() 
{ 
    return PartialView(); 
} 
+0

謝謝,我認爲它可以幫助。但我真的不明白爲什麼這種行爲不被用作默認。 –