【问题标题】:Using view models to get data back使用视图模型取回数据
【发布时间】:2014-08-21 22:15:39
【问题描述】:

假设我们有更新表格。

此表单需要两个操作。其中一个用于 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) 仅为必要的表单数据创建特殊类,并在更新后操作中使用它。

有标准的方法吗?

【问题讨论】:

  • 只有在您为它们创建表单字段或 Html.EditorFor(...) 标签时,字典才会被渲染或回发。所以我认为这是不好的做法的建议是错误的,你的代码是好的。
  • 为您要发布的必要表单数据创建特殊类...
  • @Kartikeya Khosla 是的,它是选项之一。但我想了解什么更好以及为什么。什么是工业实践。
  • @Chris F Carroll 但是人们说我们不需要有我们不使用的多余数据。他们说得有道理。但我不喜欢建议的解决方案。
  • 您的视图中是否使用了 viewModel.Dictionaries?如果是这样,那就不过分了。

标签: asp.net-mvc architecture viewmodel


【解决方案1】:

如果您的字典不是模型的一部分,那么 MVC 提供的用于将信息传递给视图的替代方法是:

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

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

或对于 .Net 4:

ViewBag.MyDictionaries= GetUpdateDictionaries(id);

您是否担心 viewModel.Dictionaries 会全部发送到客户端浏览器,然后再发送回服务器?它不会。仅在标记中呈现的内容,例如使用 Html.TextBoxFor() 发送到浏览器。所以从这个角度来看,您当前的代码是可以的。

真正反对你的字典的是,如果字典不是你的模型的模型的一部分。 OO 的重点是您的模型是 something 的模型;所以应该只具有对应于它所建模的 something 的属性。

如果您的模型不是某物的模型,而只是 ViewModel,那么将字典放在它们上面就可以了。但那样的话,Save(model) 就不行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2020-05-08
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多