我有一个带评论的博客帖子页面。 任何用户(已登录或未登录)都可以在页面底部看到一个表单以发表评论。 当用户输入评论并且她未被授权时 - 用户被重定向到登录/注册页面。 登录后,用户将重定向回操作,但包含评论正文的POST数据将丢失。
我使用ASP.NET MVC Authorize属性来要求对某些操作进行授权:
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Create(int blogPostID, string commentBody) {
var comment = new Comment {
Body = commentBody,
BlogPostID = blogPostID,
UserName = User.Identity.Name
}
// persist the comment and redirect to a blog post page with recently added comment
}
你如何解决这个问题?
在我看来,在显示评论表单之前设置用户登录是一个坏主意。
感谢。
答案 0 :(得分:3)
我可能只是将siteId保存并在会话中发表评论。然后为Create创建另一个不带任何参数的重载。它会检查会话中是否存在这些变量 - 如果是,则将其传递给原始的Create方法。
要做到这一点,您必须删除Authorize属性,然后自己进行安全检查。像这样:
var user = HttpContext.User;
if (!user.Identity.IsAuthenticated)
{
Session["Comment"] = comment;
Session["SiteId"] = siteId;
return RedirectToAction("LogOn", "Account",
new { returnUrl = "/ControllerName/Create"} );
}
然后你的重载创建:
public ActionResult Create()
{
var comment = (Session["Comment"] ?? "").ToString();
int siteId = 0;
if (Session["siteId"] != null)
siteId = (int)Session["siteId"];
return Create(siteId, comment);
}
当然,这并不是那么通用,也不能处理更复杂的场景,但这是一个想法。 (希望上面的代码有效,我没有机会测试它)。看起来您可以通过动作过滤器执行此类操作,但我没有任何示例代码。
答案 1 :(得分:1)
您可以在授权表单上使用隐藏字段。将用户的评论添加到该字段(您的初始POST数据)。之后,如果授权表单只是重定向到您的评论表单,您仍然无法使用评论表单上的数据。因此,将您的授权表格发布到评论表单中,隐藏字段中的数据也将被发布,因此您可以使用它。