使用视图模型获取数据

时间:2014-07-01 11:10:34

标签: asp.net-mvc architecture viewmodel

假设我们有更新表格。

此表单需要两个操作。其中一个用于显示数据的GET请求,另一个用于POST请求以保存更改。

[HttpGet]
public ActionResult Update(int id)
{
    var viewModel = GetViewModel(id);
    viewModel.Dictionaries = GetUpdateDictionaries(id);
    return View(viewModel);
}

[HttpPost]
public ActionResult Update(UpdateViewModel viewModel)
{
    if(Model.IsValid)
    { 
        Save(viewModel);
        return RedirectToHome();
    }
    viewModel.Dictionaries = GetUpdateDictionaries(id);
    return View(viewModel);
}

这是一种经典的方法。我们传递给POST更新相同的视图模型。但是使用这种视图模型,我们传递了许多不必要例如字典。有人说这是一种不好的做法,并建议两种不同的方式:

1)仅对表单数据使用视图模型,并通过ViewBug传递字典和其他stuuf 2)仅为必要的表单数据创建特殊类,并在更新后的操作中使用它。

有标准方法吗?

1 个答案:

答案 0 :(得分:0)

如果你的词典不是模型的一部分,那么MVC提供的将信息传递给View的替代方案是:

ViewData["MyDictionaries"]= GetUpdateDictionaries(id);

TempData["MyDictionaries"]= GetUpdateDictionaries(id);

或.Net 4:

ViewBag.MyDictionaries= GetUpdateDictionaries(id);

您是否担心viewModel.Dictionaries会全部被发送到客户端浏览器然后被发回服务器?它没有赢。只有您在标记中呈现的内容,例如用Html.TextBoxFor()将其发送到浏览器。所以从那个角度来看你现在的代码是可以的。

如果词典不是你的模型所依据的东西的一部分,那么对你的词典的真正反对意见是。 OO的重点是你的模型是某些东西的模型;因此,只应具有与其建模的某物相对应的属性。

如果你的模型不是某些东西的模型,而只是ViewModel的模型,那么就可以将字典放在它们上面了。但在这种情况下,Save(model)不会很好。