3

我有一个带有评论的博客文章页面。任何用户(无论是否登录)都可以在页面底部看到一个表单来发表评论。当用户输入评论并且她未被授权时 - 用户被重定向到登录/注册页面。登录后,用户被重定向回操作,但包含评论正文的 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
}

你怎么解决这个问题?

我认为在显示评论表单之前让用户登录是一个坏主意。

谢谢。

4

2 回答 2

3

我可能只是保存 siteId 并在 Session 中发表评论。然后为 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);
}

当然,这并不是那么通用,也不能处理更复杂的场景,但这是一个想法。(希望上面的代码有效,我还没有机会测试它)。似乎您可以通过动作过滤器执行类似的操作,但我没有任何示例代码。

于 2012-04-10T21:48:44.153 回答
1

您可以在授权表上使用隐藏字段。将用户的评论放在该字段(您的初始 POST 数据)。之后,如果授权表单只是重定向到您的评论表单,您仍然无法使用评论表单上的数据。因此,将您的授权表发布到评论表中,隐藏字段中的数据也会被发布,因此您可以使用它。

于 2012-04-10T21:42:37.163 回答