gpt4 book ai didi

asp.net-mvc - Asp.Net mvc 嵌套操作 HTTPPOST

转载 作者:行者123 更新时间:2023-12-02 02:12:31 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我的观点:

@{
ViewBag.Title = "Index";
}

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

我的 Controller :

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 操作的情况下覆盖此行为?

最佳答案

这是默认行为。这是设计使然。如果您不能更改 POST Index2 操作名称,您可以编写一个自定义操作名称选择器,即使当前请求是 POST 请求,它也会强制使用 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;
}
}

然后用它装饰你的两个 Action :

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

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

关于asp.net-mvc - Asp.Net mvc 嵌套操作 HTTPPOST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com