所以,我已经看到这个工作在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,我也试过了..
我遇到的关键问题是,在pint中我们从上下文中获取“model”变量,它是null。如果我在调试时查看filterContext.ActionParameters,我可以看到MyDomainObj实例!看来(因为它碰巧有一个与MyViewModel类型共同的道具名称)已经从我的表格数据中映射出来了!
所以..是的,如果我将MyViewModel类型作为此方法的参数,则可以从提交的表单中正确填充参数。但。我不想这样做,我想(并且之前基于JB的简洁操作方法)将视图模型转换为域模型,作为执行/执行操作的一部分,然后能够点击保存在我身上领域模型。
摘要 - 为什么我的ViewData.Model在post动作过滤器上为null?
答案 0 :(得分: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,您似乎试图避免使用它。但除非你编写一个自定义模型绑定器,否则你不会神奇地在模型中获取formdata,因为内置的一个查看动作参数以找出要绑定的内容。出于这个原因,我建议不要使用域模型作为操作的参数,因为它可能会填写您不希望它的字段。
我也看到Jimmy使用ModelBinder做一些类似于你的AutoMapGet的东西,这可能是另一种替代方法,但我猜你已经看过那篇文章了。
我的标准帖子采用了Matt的方法,将验证移到了一个全局属性中,因此不能忘记(这有一些缺点)然后接受表单数据的新视图模型明确,然后我明确加载实体,使用automapper来更新它并调用save。大多数动作最终只有5行左右。
我确实避免在AutoMapper上使用静态方法并在via构造函数注入中传递IMapper。如果我真的需要的话,这允许我使它更容易测试,但是这些方法通常非常简单,测试不会增加太多的价值。