使用模型绑定器时,ASP.NET MVC中的往返视图数据

时间:2011-01-05 02:06:03

标签: c# asp.net asp.net-mvc model-binding

假设我的表单中包含以下“业务对象”:

public class MyObject
{
    public string Name { get; set; }
    public User OtherUser { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

当用户将数据输入任何字段时,我需要往返他们输入的内容,以便他们纠正任何指法等,而无需重新输入他们的回复。

因为我无法在DateTime字段中往返“2011年2月31日”之类的值,所以我最终使用 View Model 这样的对象:

public class MyObjectViewModel
{
    public string Name { get; set; }
    public string OtherUserName { get; set; }
    public string CreateDate { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
}

好的,一切都很好,花花公子,当使用以下模式时,我可以使其与裸业务对象和值往返完全相同:

public ActionResult Create(FormCollection form)
{
    var model = new MyObjectViewModel();
    if (TryUpdateModel(model, form) && ModelState.IsValid)
    {
         // ...
    }

    return View(model);
}

我有以下问题:

  1. 从View模型和业务对象中获取数据的最简洁方法是什么? (即什么填写了上述方法的其余部分?)
  2. 我可以减少对象之间字段名称的重复,以便合并我的更改吗?
  3. 在上面的示例中,字段OtherUserNamestring,需要转换为User对象。这是谁的责任?控制器? ViewModel?模型活页夹?

3 个答案:

答案 0 :(得分:2)

  1. AutoMapper
  2. 你不需要。
  3. 映射器
  4. 示例:

    [HttpPut]
    public ActionResult Create(MyObjectViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            // there are validation errors => redisplay the view
            return View(viewModel);
        }
        var model = Mapper.Map<MyObjectViewModel, MyObject>(viewModel);
        _repository.DoSomethingWithTheModel(model);
        return RedirectToAction("Success")
    }
    

答案 1 :(得分:0)

您的问题主要是由于允许视图模型包含无效数据。在视图模型上使用与数据类相同的强类型,添加一点javascript验证,“Feb 31”永远不会进入服务器。解析类型绝对是模型绑定器的责任 - 您不需要执行任何操作,您的控制器操作只会传递一个强类型模型对象。用户可能有点不同 - 主要区别可能是您的viewmodel有一个名为username的字段,而数据模型需要一个用户对象,其中包含不在表单上的信息。您的控制器需要获取/创建适当的用户对象并将其添加到数据类。

在解析模型之后,您仍然会在服务器端进行一些验证,但这将是更自定义的内容,例如检查字段是否彼此一致而不是简单的字符串格式问题。

为了减少重复,我在另一个问题上发布了我的模型风格 - asp.mvc model design

答案 2 :(得分:-1)

1)您可以强烈键入视图,以便视图将控制器传递给“MyObject”类型。 2)不确定我明白你在问什么 3)为什么不将此字段设为包含链接ID的外键的ID?

此外 - 没有理由将datetime字段传递给视图并按原样返回左侧。您不需要将其作为字符串传递并转换。

PS - 我建议看一下这个教程 - 应该为你澄清我的答案。

http://www.asp.net/mvc/videos/what-is-aspnet-mvc-80-minute-technical-video-for-developers-building-nerddinner