你怎么能有一个表单,不需要用户登录,直到他们点击提交,并在这一点上提交表单,如果用户登录,否则重定向到登录页面。那么在用户登录成功后,提交原始表单?原始表单还有一个<输入类型=“文件”>元素,除非用户成功登录,否则不应上传文件。MVC发布数据从表单登录后重定向提交按钮点击
回答
事实证明我不能做我想做的事情,因为以编程方式填充<输入类型=文件>字段存在安全隐患,因此这是不允许的。
MVC处理此情形。只需将"[Authorize]"
属性上的表单提交到具有[HttpPost]的表单。在用户未登录时发布表单,他将被重定向到帐户控制器登录操作(/帐户/登录),并且将呈现登录视图;这是因为它是在web.config中设置的。除此重定向外,还添加了查询字符串参数“ReturnUrl =/orginalform”。 MVC登录操作然后执行登录并将用户重定向到原始表单。
更新:这是应该在自定义属性去,将捕获表单数据,如果你需要保留表单数据(这不是测试,只有编译)
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(
AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string loginUrl = "/Account/Login"; //Get this from web.config instead of hardcode
if (filterContext.HttpContext.Request != null)
{
loginUrl += "?ReturnUrl=" + filterContext.HttpContext
.Request
.Url
.AbsoluteUri;
foreach(var formData in filterContext.HttpContext.Request.Form)
{
loginUrl += "&"+formData.ToString();
}
}
filterContext.Result = new RedirectResult(loginUrl);
}
}
}
您可能需要的代码对登录帖子操作进行一些修改。此外,返回表单获取操作应从uri字符串[FromUri]
获取表单数据并再次呈现表单。
我知道这是旧的文章,希望我的经验将帮助别人:
我有两个提交按钮和被调用从他们两个处理表单提交的常用方法 - 条件语句检查哪个按钮正在提交表格。
在要求用户进行身份验证的按钮上,它返回HttpUnauthorizedResult()
以强制用户回到登录页面。 登录后,用户将被发送回填充字段值的表单,因为它们存储在TempData条目中,但用户仍然需要再次单击该按钮才能提交数据。
因此,我添加了一个名为AutoSave
的布尔型TempData变量,它将在返回HttpUnauthorizedResult()
之前设置。 我再次加载表单之前检查它,如果AutoSave == true
我只是重定向到处理提交的方法。 工程就像一个魅力。
这里的示例代码:
private ActionResult ProcessOnlineApplication(OnlineApplicationViewModel application){
//if not submit make sure it's save.
if (application.SubmitAction == "Save")))
{
if(!User.Identity.IsAuthenticated)
{
//Keep a copy of the application until logged in
TempData["PendingOnlineApplication"] = application;
TempData["AutoSave"] = true;
return new HttpUnauthorizedResult();
}
else{
//Everything goes here
}
}
}
public ActionResult OnlineApplicationForm(){
var viewModel = TempData["PendingOnlineApplication"] as OnlineApplicationViewModel;
if (TempData.ContainsKey("AutoSave") && Convert.ToBoolean(TempData["AutoSave"]) && viewModel != null)
{
TempData["AutoSave"] = false;
return ProcessOnlineApplication(viewModel);
}
if (viewModel == null)
{
viewModel = CreateModel();
}
return GetOnlineApplicationAction(viewModel);
}
我觉得这很有用。谢谢。 – w0051977
- 1. 表单 - 点击提交后重定向
- 2. 点击提交表单后重定向
- 3. 提交一个登录表单出来点击登录按钮
- 4. Django - 在点击重定向后提交无效表单提交按钮
- 5. 单击提交按钮后的重定向按钮[HTML]
- 6. 当表单提交按钮被点击时重定向
- 7. ASP.NET MVC - 表单提交后重定向
- 8. 点击提交后按钮
- 9. 点击“提交”按钮后未保存的数据 - MVC 5
- 10. 点击Facebook登录按钮后重定向,即使已经登录Facebook
- 11. 防止表单重新提交后点击按钮
- 12. php登录表单并提交按钮
- 13. 表单提交,虽然点击按钮不是提交按钮
- 14. 提交登录表单后的强制重定向
- 15. 点击提交按钮后点击f5
- 16. 点击提交后父级重定向
- 17. 点击提交后重定向
- 18. 点击提交后重定向页面
- 19. PhantomJS按钮点击和表单提交
- 20. 上点击按钮时提交表单
- 21. 提交一个表单,然后重定向到PayPal按钮
- 22. 重定向提交按钮
- 23. 表单提交和JavaScript函数调用提交按钮点击春天mvc?
- 24. 登出后点击'返回'按钮重定向到登录页面
- 25. 使用JavaScript重定向是嵌入表单时,点击提交按钮
- 26. MVC登录表单不是重定向
- 27. 提交表单时触发点击事件按钮被触发
- 28. 单击提交按钮后,如何从mysql加载数据?
- 29. 点击在提交登录形式重定向到index.php,并不登录
- 30. 登录。表单返回按钮发布数据
他们将不得不用这种方法 –
再次填写表格如果你需要,那么你需要修改默认RETURNURL机制,包括表单数据。你需要你自己的Authorize属性,它可以添加表单数据和返回url。然后,登录操作将使用此数据重定向到原始网址。在表单的获取动作中,您需要处理从uri获取表单参数,然后再次渲染表单。首先我建议创建一个派生自'AuthorizeAttribute'的CustomAuthorize属性并重写OnAuthorization方法。 –
更新了上述帖子检查它。 –