假设我的表单中包含以下“业务对象”:
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);
}
OtherUserName
是string
,需要转换为User
对象。这是谁的责任?控制器? ViewModel?模型活页夹?答案 0 :(得分:2)
示例:
[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 - 我建议看一下这个教程 - 应该为你澄清我的答案。