2012-11-17 47 views
4

你怎么能有一个表单,不需要用户登录,直到他们点击提交,并在这一点上提交表单,如果用户登录,否则重定向到登录页面。那么在用户登录成功后,提交原始表单?原始表单还有一个<输入类型=“文件”>元素,除非用户成功登录,否则不应上传文件。MVC发布数据从表单登录后重定向提交按钮点击

回答

1

事实证明我不能做我想做的事情,因为以编程方式填充<输入类型=文件>字段存在安全隐患,因此这是不允许的。

2

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]获取表单数据并再次呈现表单。

+1

他们将不得不用这种方法 –

+0

再次填写表格如果你需要,那么你需要修改默认RETURNURL机制,包括表单数据。你需要你自己的Authorize属性,它可以添加表单数据和返回url。然后,登录操作将使用此数据重定向到原始网址。在表单的获取动作中,您需要处理从uri获取表单参数,然后再次渲染表单。首先我建议创建一个派生自'AuthorizeAttribute'的CustomAuthorize属性并重写OnAuthorization方法。 –

+0

更新了上述帖子检查它。 –

1

我知道这是旧的文章,希望我的经验将帮助别人:

我有两个提交按钮和被调用从他们两个处理表单提交的常用方法 - 条件语句检查哪个按钮正在提交表格。

在要求用户进行身份验证的按钮上,它返回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); 
} 
+0

我觉得这很有用。谢谢。 – w0051977