gpt4 book ai didi

asp.net-mvc - 验证失败后重新填充嵌套的 ViewModel

转载 作者:行者123 更新时间:2023-12-04 06:02:16 25 4
gpt4 key购买 nike

我们有 View 模型,其中包含其他 View 模型。例如,我在几乎所有其他 View 模型下都有一个导航 View 模型,因为每个屏幕都有导航。构建导航 View 模型的逻辑集中在一处。

问题是引用类型,如 View 模型,在 POST 期间被清除。这是有道理的,但这意味着如果我们需要再次返回 View ,例如验证失败时,我们必须部分重建 View 模型。我们不能只是从头开始重建 View 模型,因为它们包含部分输入的数据。

现在,我们正在手动检查 ModelState.IsValid 并手动重建每个 subview 模型。我们通过创建称为构建器的类型来构建我们的 View 模型来消除重复的逻辑。这些构建器目前有三种构建方法:一种用于构建空白 View 模型,一种用于处理验证问题,一种用于处理编辑。

ViewModel Build(<params>) // create
void Build(ViewModel, <params>) // validation error
ViewModel Build(DBObject, <params>) // edit

这似乎是重大的矫枉过正。 90% 的情况下,如果一个属性是另一个 View 模型,它应该被重建。如果有一个 3rd 方库可以将 View 模型映射到构建器类,只在需要的基础上构建它们,那就太好了。当然,它会是递归的,并且也会构建 subview 模型。代替:
return View(viewModel) 

或者
return RedirectToAction("index", "home", viewModel) 

只会有像这样的助手:
return View<ViewModel>()

或者
return RedirectToAction<ViewModel>("index", "home")

最佳答案

For instance, I have a navigation view model under just about every other view model, since every screen has navigation. The logic for building the navigation view model is in one place.



这似乎是拆分 View 模型和使用 Html.Action helper 的绝佳选择。从单独的子操作呈现您的导航菜单。

这样您就不必再担心主要操作和 View 模型。

所以这个想法是你可以有一个菜单 Controller 负责生成菜单:
public class MenuController: Controller
{
private readonly IMenuRepository _repository;
public MenuController(IMenuRepository repository)
{
_repository = repository;
}

[ChildActionOnly]
public ActionResult Index()
{
var menu = _repository.GetMenu();
var menuViewModel = Mapper.Map<Menu, MenuViewModel>(menu); // AutoMapper example
return View(menuViewModel);
}
}

那么相应的索引 View 将是一个仅包含菜单标记的部分:
@model MenuViewModel
@{
Layout = null;
}
<ul>
<li>....
<li>....
</ul>

然后你可以在你的 _Layout 中在其定义的位置呈现菜单:
@Html.Action("index", "menu")

然后,您可以拥有与此菜单渲染完全分离的 Controller 和 View 模型。

关于asp.net-mvc - 验证失败后重新填充嵌套的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8809453/

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