Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC3:在父视图中显示子视图中的验证错误_C#_Asp.net Mvc 3_Validation_Parent Child - Fatal编程技术网

C# ASP.NET MVC3:在父视图中显示子视图中的验证错误

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

我正在尝试添加一个表单,允许用户在我的博客应用程序上评论帖子。到目前为止,我已经在PostDetails视图中添加了一个表单,我可以提交评论,并将它们正确地添加到我的数据库中。但是,我在向用户显示验证错误时遇到问题。注释表单包含在部分视图中,并在post详细信息视图中使用
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.
}