3

私は奇妙な問題を抱えています。私の見解 :

@{
   ViewBag.Title = "Index";
}

<h2>Index</h2>
@using(Html.BeginForm())
{
     <input type="submit"  value="asds"/>
}
@Html.Action("Index2")

私のコントローラー:

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。私の論理は、1つ[ChildActionOnly()]ActionResult Index2()の代わりにそれを教えてくれHttpPostます。

なぜこうなった?アクションの名前を変更せずに、この動作をオーバーライドするにはどうすればよい[HttpPost]Index2ですか?

4

1 に答える 1

2

これがデフォルトの動作です。これは設計によるものです。POST アクション名を変更できない場合は、現在のリクエストが POST リクエストであってもIndex2、GET アクションの使用を強制するカスタム アクション名セレクターを作成できます。Index2

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;
    }
}

そして、それであなたの2つのアクションを飾ります:

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

[ChildActionOnly]
[PreferGetChildActionForPost]
public ActionResult Index2()
{
    return PartialView();
}
于 2012-08-25T06:46:20.793 に答える