gpt4 book ai didi

c# - ASP.NET MVC3 : Displaying Validation Errors from Child View in Parent View

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:27 26 4
gpt4 key购买 nike

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

我在这里尝试了几种返回 View 的方法,但是我在父操作中进行的一些 Controller 参数验证使我的问题变得更加复杂:

//
// 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 的工作方式。如果提供了帖子 ID,则会从数据库中获取帖子以及在创建帖子时创建的 slug。如果 URL 中的 slug 与数据库中的不匹配,它会重定向以包含该 slug。这工作得很好,但这确实意味着我在尝试填充我的父 View 模型时遇到问题,如下所示:

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.NewComment,测试它是否有数据,然后用它来显示任何模型错误。不幸的是,我不知道如何做到这一点。 This question 帮助我塑造了我的方法,但它并没有完全解决我的问题。

有人可以轻轻地插入我朝着正确的方向前进吗?如果我的方法看起来不合理,我很乐意找出原因以及可能的解决方法。

非常感谢。

最佳答案

忘记在这里填写我的答案。对于碰巧遇到这个问题的任何人,答案是使用 TempData 来存储 ModelState 错误,然后在相关的 Controller 操作中重新填充 ModelState .

首先,我在 Controller 中声明了一个键,用于引用 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);
}

此操作确定在向数据库添加评论之前 ModelState 是否有效。如果 ModelState 无效,则会将其复制到 TempData,使其可用于第一个操作。

// 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.
}

关于c# - ASP.NET MVC3 : Displaying Validation Errors from Child View in Parent View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7027479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com