Asp.net mvc 3 在mvc 3中从登录重定向后发送POST值
场景 我正在尝试使用asp.NETMVC3在我的管理面板中构建论坛,只有授权用户才能更新新帖子和评论帖子。下面是PostsController的注释功能Asp.net mvc 3 在mvc 3中从登录重定向后发送POST值,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,场景 我正在尝试使用asp.NETMVC3在我的管理面板中构建论坛,只有授权用户才能更新新帖子和评论帖子。下面是PostsController的注释功能 [Authorize] public ActionResult Comment(int id, string name, string email, string body) { Post post = GetPost(id); Comment comment
[Authorize]
public ActionResult Comment(int id, string name, string email, string body)
{
Post post = GetPost(id);
Comment comment = new Comment();
User CurrentUser = repository.GetUser(User.Identity.Name);
comment.UserID = CurrentUser.ID;
comment.Post = post;
comment.DateTime = DateTime.Now;
comment.Name = User.Identity.Name;
comment.Email = email;
comment.Body = body;
model.AddToComments(comment);
model.SaveChanges();
return RedirectToAction("Details", new { id = id });
}
问题:
如果有人在未登录的帖子上发表评论,页面将重定向到登录页面,在以授权访问权限登录后,评论表单的帖子值不会通过评论操作识别。注释表的代码为:
<form action="@Href("~/Posts/Comment/" + post.ID)" method ="post">
<input type="text" id="commentNamePrompt" name="name" />
Name (required)
<br />
<input type="text" id="commentEmailPrompt" name="email" />
Email (optional)
<br />
<textarea id="commentBodyInput" name="body" rows="10" cols="60"></textarea>
<input type="submit" id="commentSubmitInput" name="submit" value="Submit!" />
</form>
已尝试:
我试着先登录到该网站,然后在帖子上发表评论,效果很好
我确信发生错误的原因是在重定向到登录页面和从登录页面重定向之后没有传递模型post值。
如何重定向到未经授权的用户更新了评论表单post值的授权页面。我认为唯一的方法是将您的评论字段作为隐藏字段保存到另一个登录表单中。这可以通过在Authorized属性中拦截未经授权的请求并重定向到带有注释字段的备用登录页来完成:
public class CommentAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var form = filterContext.RequestContext.HttpContext.Request.Form;
var commentNamePrompt = form.Get("commentNamePrompt");
var commentEmailPrompt = form.Get("commandEmailPrompt");
var commentBodyInput = form.Get("commentBodyInput");
var url = new UrlHelper(filterContext.RequestContext);
var logonUrl = url.Action("LogonWithComment", "Account", new { commentNamePrompt, commentEmailPrompt, commentBodyInput });
filterContext.Result = new RedirectResult(logonUrl);
}
}
注释字段可以填充到LogonWithComment视图中,并成为登录帖子的一部分
这不是一个很好的解决方案。如果可能的话,我会首先寻找一种方法来避免这种情况。我认为唯一的方法是将您的注释字段作为隐藏字段保存到另一个登录表单中。这可以通过在Authorized属性中拦截未经授权的请求并重定向到带有注释字段的备用登录页来完成:
public class CommentAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var form = filterContext.RequestContext.HttpContext.Request.Form;
var commentNamePrompt = form.Get("commentNamePrompt");
var commentEmailPrompt = form.Get("commandEmailPrompt");
var commentBodyInput = form.Get("commentBodyInput");
var url = new UrlHelper(filterContext.RequestContext);
var logonUrl = url.Action("LogonWithComment", "Account", new { commentNamePrompt, commentEmailPrompt, commentBodyInput });
filterContext.Result = new RedirectResult(logonUrl);
}
}
注释字段可以填充到LogonWithComment视图中,并成为登录帖子的一部分
这不是一个很好的解决方案。如果可能的话,我会首先寻找一种方法来避免这种情况。AFAIK,MVC中没有内置的功能来支持这些东西,您需要为此扩展
操作过滤器,或者考虑其他方法。AFAIK,MVC中没有内置的功能来支持这些东西,您需要为此扩展操作过滤器
,或者考虑其他方法。是的,这是一种选择,但我需要为注释创建单独的登录页面,我认为这可能不合适。无论如何,谢谢你的替代解决方案。是的,这是一个替代方案,但我需要为我认为可能不合适的评论制作单独的登录页面。不管怎样,谢谢你的替代方案。