C# ASP.NET MVC3:在父视图中显示子视图中的验证错误
我正在尝试添加一个表单,允许用户在我的博客应用程序上评论帖子。到目前为止,我已经在PostDetails视图中添加了一个表单,我可以提交评论,并将它们正确地添加到我的数据库中。但是,我在向用户显示验证错误时遇到问题。注释表单包含在部分视图中,并在post详细信息视图中使用C# ASP.NET MVC3:在父视图中显示子视图中的验证错误,c#,asp.net-mvc-3,validation,parent-child,C#,Asp.net Mvc 3,Validation,Parent Child,我正在尝试添加一个表单,允许用户在我的博客应用程序上评论帖子。到目前为止,我已经在PostDetails视图中添加了一个表单,我可以提交评论,并将它们正确地添加到我的数据库中。但是,我在向用户显示验证错误时遇到问题。注释表单包含在部分视图中,并在post详细信息视图中使用Html.RenderAction呈现。我想强调的是,我不想使用AJAX来实现这一点,因为我想从渐进增强的角度来实现这一点 以下是相关的发布操作: [HttpPost, Authorize] public ActionResul
Html.RenderAction
呈现。我想强调的是,我不想使用AJAX来实现这一点,因为我想从渐进增强的角度来实现这一点
以下是相关的发布操作:
[HttpPost, Authorize]
public ActionResult AddComment(CommentViewModel newComment)
{
if (ModelState.IsValid)
{
Comment comment = new Comment(_userRepository.GetByUsername(User.Identity.Name));
Mapper.Map(newComment, comment);
_commentRepository.Add(comment);
_postsRepository.CommentAdded(comment.Article);
return RedirectToAction("Index", new { id = newComment.PostID });
}
// What do I do here?
}
我在这里尝试了几种返回视图的方法,但由于在父操作中进行了一些控制器参数验证,我的问题变得更加复杂:
//
// GET: /Posts/5/this-is-a-slug
public ActionResult Index(int id, string slug)
{
PostViewModel viewModel = new PostViewModel();
var model = _postsRepository.GetByID(id);
if (model != null)
{
if (slug == null || slug.CompareTo(model.Slug) != 0)
{
return RedirectToActionPermanent("Index", new { id, slug = model.Slug });
}
else
{
_postsRepository.PostVisited(model);
Mapper.Map(model, viewModel);
viewModel.AuthorName = _userRepository.GetById(model.AuthorID);
}
}
return View(viewModel);
}
这个动作基本上模仿了SO的URL的工作方式。如果提供了post ID,则post将与创建post时创建的slug一起从数据库中获取。如果URL中的slug与数据库中的slug不匹配,它将重定向以包含slug。这很好,但这确实意味着我在尝试填充父视图模型时遇到了问题,如下所示:
public class PostViewModel
{
public int PostID { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public string Slug { get; set; }
public DateTime DatePublished { get; set; }
public int NumberOfComments { get; set; }
public int AuthorID { get; set; }
public string AuthorName { get; set; }
public List<CommentViewModel> Comments { get; set; }
public CommentViewModel NewComment { get; set; }
}
公共类PostViewModel
{
公共int PostID{get;set;}
公共字符串标题{get;set;}
公共字符串体{get;set;}
公共字符串Slug{get;set;}
public DateTime DatePublished{get;set;}
public int NumberOfComments{get;set;}
公共int AuthorID{get;set;}
公共字符串AuthorName{get;set;}
公共列表注释{get;set;}
public CommentViewModel新成员{get;set;}
}
我所希望的是填充PostViewModel.newcommon
,测试它是否有数据,然后使用它显示任何模型错误。不幸的是,我不知道如何做到这一点。帮助我形成了我的方法,但它并没有完全解决我的问题
有人能帮我朝正确的方向轻轻推一下吗?如果我的方法似乎不合理,我很想找出原因以及可能的解决办法
非常感谢。忘了在这里填写我的答案。对于偶然发现此错误的任何人,答案是使用
TempData
存储ModelState
错误,然后在相关控制器操作中重新填充ModelState
首先,我在控制器中声明了一个键,用于引用TempData
中的数据。我决定将其基于CommentViewModel
类型,因为这两个操作都依赖于它
public class PostsController : Controller
{
private static readonly string commentFormModelStateKey = typeof(CommentViewModel).FullName;
// Rest of class.
}
在第一个操作中,代码检查TempData
是否包含分配给键的数据。如果是,则将其复制到ModelState
// GET: /posts/comment
[ChildActionOnly]
public PartialViewResult Comment(PostViewModel viewModel)
{
viewModel.NewComment = new CommentViewModel(viewModel.PostID, viewModel.Slug);
if (TempData.ContainsKey(commentFormModelStateKey))
{
ModelStateDictionary commentModelState = TempData[commentFormModelStateKey] as ModelStateDictionary;
foreach (KeyValuePair<string, ModelState> valuePair in commentModelState)
ModelState.Add(valuePair.Key, valuePair.Value);
}
return PartialView(viewModel.NewComment);
}
// POST: /posts/comment
[HttpPost, Authorize]
public ActionResult Comment(CommentViewModel newComment)
{
if (!ModelState.IsValid)
{
TempData.Add(commentFormModelStateKey, ModelState);
return Redirect(Url.ShowPost(newComment.PostID, newComment.Slug));
}
// Code to add a comment goes here.
}