1

所以,我在 MVC3 中的一个以前的项目中看到了这个工作,所以想知道是否 a)我把它搞砸了,或者 b)MVC4 正在做一些不同的事情(看不到它会是)。

我有一个模型绑定 Razor 视图,它提交给控制器操作方法(与 MVC 一样)

后期操作方法:

[HttpPost]
[AutoMap(typeof(MyViewModel), typeof(MyDomainObj))]
public void PostAction(MyDomainObj obj)
{... etc.. etc.. 

动作过滤器最终会做这样的事情:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var model = filterContext.Controller.ViewData.Model;

注意:在 Jimmy Bogard 的示例中,他使用了我也尝试过的 OnActionExecuted。

我遇到的关键问题是,在我们从上下文中获取“模型”变量的地方,它是空的。如果我在调试时查看 filterContext.ActionParameters 我可以看到一个 MyDomainObj 实例!这似乎(因为它恰好有一个与 MyViewModel 类型相同的道具名称)已从我的表单数据映射!

所以.. 是的,如果我将 MyViewModel 类型作为此方法的参数,那么参数将从提交的表单中正确填充。但。我不想那样做,我想(并且之前根据 JB 的简洁操作方法做过)将视图模型转换为域模型作为执行/执行操作的一部分,然后能够在我的域模型。

摘要 - 为什么我的 ViewData.Model 在后操作过滤器上为空?

4

1 回答 1

0

Jimmmy 也有/有一些关于如何实施帖子操作的想法,还有另一个人 Matt Honeycutt,他分享了他对如何发布帖子的看法。我也相信 Jimmy 已经朝着在他的 get 请求中使用显式映射而不是属性的方向发展,因为在映射之后很难注入任何你需要的额外代码。

http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/

http://trycatchfail.com/blog/post/Cleaning-up-POSTs-in-ASPNET-MVC-the-Fail-Tracker-Way.aspx

对于一个帖子,你真的想要一些东西,原始实体和表单数据。您可以像对 GET 请求一样加载实体,并执行普通模型绑定以获取表单数据(请记住,您可以接受与在视图中吐出不同的回发模型),然后在操作中进行更改。

当然,这需要在您的操作中使用 AutoMapper,您似乎试图避免这种情况。但是除非您编写自定义模型绑定器,否则您不会神奇地在模型中获取表单数据,因为内置模型会查看操作参数以找出要绑定的内容。出于这个原因,我建议不要将域模型用作操作的参数,因为它可能会填写您不希望填写的字段。

我还看到 Jimmy 使用 ModelBinder 执行类似于您的 AutoMapGet 的操作,这可能是另一种替代方法,但我猜您已经看过那篇文章。

我的标准帖子采用了马特的方法,将验证移到全局属性中,这样就不会被遗忘(这有一些缺点),然后显式接受表单数据的新视图模型,然后显式加载实体,使用automapper 更新它并调用保存。大多数动作最终只有大约 5 行长。

我确实避免在 AutoMapper 上使用静态方法,并通过构造函数注入传入 IMapper。如果我真的需要,这让我可以让它更容易测试,但是方法通常很简单,测试不会增加那么多价值。

于 2012-10-06T01:07:22.657 回答