4

您如何拥有一个在用户单击提交之前不需要用户登录的表单,如果用户已登录,则此时提交表单,否则重定向到登录页面。那么用户登录成功后,提交原始表单呢?原始表单也有一个 <input type="file"> 元素,除非用户成功登录,否则不应上传文件。

4

3 回答 3

3

我知道这是一篇旧帖子,希望我的经验对某人有所帮助:

我有两个提交按钮和一个通用方法,用于处理来自它们的表单提交 - 条件语句检查哪个按钮正在提交表单。

在要求用户进行身份验证的按钮上,它返回HttpUnauthorizedResult()以强制用户返回登录页面。登录后,用户将被发送回填写字段值的表单,因为它们存储在 TempData 条目中,但用户仍需要再次单击按钮以提交数据。

因此,我添加了一个名为 TempData 的布尔变量AutoSave,该变量将在返回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);
}
于 2017-03-29T04:53:47.653 回答
2

MVC 处理这种情况。只需将"[Authorize]"属性仅放在具有 [HttpPost] 的表单发布操作上。在用户未登录时发布表单时,他将被重定向到帐户控制器登录操作(/Account/Login)并呈现登录视图;这是因为它是在 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]并再次呈现表单。

于 2012-11-17T07:47:27.483 回答
1

事实证明,我不能做我想做的事,因为以编程方式填充 <input type=file> 字段存在安全风险,并且不允许这样做。

于 2012-11-22T19:09:54.137 回答