您如何拥有一个在用户单击提交之前不需要用户登录的表单,如果用户已登录,则此时提交表单,否则重定向到登录页面。那么用户登录成功后,提交原始表单呢?原始表单也有一个 <input type="file"> 元素,除非用户成功登录,否则不应上传文件。
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);
}
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]
并再次呈现表单。
事实证明,我不能做我想做的事,因为以编程方式填充 <input type=file> 字段存在安全风险,并且不允许这样做。