1

场景 我正在尝试使用 asp.net MVC 3 在我的管理面板中构建论坛,其中只有授权用户才能更新新帖子和评论帖子。下面是我的 PostsController 的评论功能

  [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>

错误

This property cannot be set to a null value.

尝试过: 我尝试先登录该站点并评论帖子,它工作正常我确信错误是由于在重定向到登录页面和从登录页面后未传递模型帖子值而发生的。如何使用未经授权的用户更新的评论表单帖子值重定向到授权页面。

4

1 回答 1

1

我认为唯一的方法是将您的评论字段作为隐藏字段保存到替代登录表单中。这可以在 AuthorizeAttribute 中通过拦截未经授权的请求并使用您的评论字段重定向到另一个登录页面来完成:

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 视图中,并成为登录 POST 的一部分。

这不是一个很好的解决方案。如果可能的话,我会首先寻找一种避免这种情况的方法。

于 2012-07-01T07:21:48.070 回答