我正在尝试通过编写ActionFilter来处理多个表单提交。我是ActionFilters领域的新手,不知道从哪里开始任何帮助将不胜感激。 我看过这个问题,但无法得到一个起点
答案 0 :(得分:3)
我会为此使用防伪令牌。你应该已经生成它(如果你不想受到CSRF攻击的影响),并且它对于每个生成的表单都是唯一的..所以你可以创建一个基本上可以做的过滤器:
答案 1 :(得分:0)
http://blogs.sonatribe.com/wayne/2011/08/15/acceptparameterattribute-update/
我解释了如何创建一个属性,允许您根据启动提交的提交按钮的名称切换目标操作。
如果您需要指针,请告诉我
答案 2 :(得分:0)
我想建议一个答案。 这是代码
public class ValidateSubmitOnceTokenAttribute : ActionFilterAttribute
{
public String ErrorView { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
String submitOnceToken = null;
submitOnceToken = filterContext.HttpContext.Request[ViewHelper.SubmitOnceIdentifier];
if ((bool)filterContext.HttpContext.Session[ViewHelper.SubmitOnceIdentifier + submitOnceToken])
{
if (String.IsNullOrEmpty(View))
{
filterContext.Result = new EmptyResult();
}
else
{
ViewResult newView = new ViewResult();
newView.ViewName = ErrorView;
filterContext.Result = newView;
}
}
else
{
filterContext.HttpContext.Session[ViewHelper.SubmitOnceIdentifier + submitOnceToken] = true;
}
}
}
public partial class ViewHelper
{
internal const string SubmitOnceIdentifier = "_SUBMIT_ONCE_";
public static MvcHtmlString SubmitOnceToken()
{
Guid submitOnceToken = Guid.NewGuid();
HttpContext.Current.Session[SubmitOnceIdentifier + submitOnceToken] = false;
return new MvcHtmlString("<input type=\"hidden\" name=\"" + SubmitOnceIdentifier + "\" value=\"" + submitOnceToken.ToString() + "\">");
}
}
之后,您只需要在方法中包含此属性
[ValidateSubmitOnceToken(View="ErrorSubmitOnce")]
public ActionResult MyAction(Model) {
....
}
并在您的视图中包含此内容
@ViewHelper.SubmitOnceOnlyToken()
此答案使用Aliostad描述的技术,但使用动作过滤器实现。