【发布时间】:2014-07-07 21:59:55
【问题描述】:
我刚刚在当前项目中遇到这个主题,我想知道在提交表单时使用 HttpPost 方法时处理对象丢失“问题”的最佳方法。通过网络和 stackoverflow 上的帖子,我收集了一些处理它的方法。
所以,一旦我知道视图模型从 HttpGet 请求中获取对象或列表,它们就会因为 http 的无状态特性而丢失。我现在已经看到了在将视图模型传回视图时取回对象的不同方法。
在隐藏字段中存储对象
@Html.HiddenFor(m => m.Object)
如果视图模型属性是可序列化的,这似乎工作正常。但是,如果对象背后有逻辑呢?这适用于所有场景吗?另一方面,我不希望我的视图模型中的每个对象,只是用于显示和用户可以交互的对象。
通过 AJAX 和 HelperMethods 获取对象
@Html.Some3rdParty().ComboBoxFor(m => m.List)
.DataSourceUrl(@Url.Action("GetComboSource"))
[ComboBoxSource]
public ActionResult GetComboSource()
{
var data = Service.GetStaticSource();
return Json(data);
}
使用 Kendo UI MVC 等 3rd 方库,我可以轻松地将 .DataSourceUrl() HtmlHelper 放在我的控件上,以请求控制器提供数据源。或者只是使用 jQuery 的 $.get() 方法。问题是:如果我不能使用这样的库或者要求说必须尽可能避免使用 JS 怎么办?
在 HttpPost 控制器操作中取回对象
[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
var tempViewModel = Service.GetViewModel(viewModel.Id);
viewModel.Object = tempViewModel.Object;
return View(viewModel);
}
这个对我来说似乎有点脆弱。在发布操作中,我必须调用提供视图模型的任何服务,提取某些对象并将它们附加到我收到的视图模型中。
目前我能想到的就这些了,总之:
我想知道,在整个项目中处理它的最佳做法是什么,以及可维护性的最佳方法是什么?
对我来说,到目前为止似乎还没有完美的解决方案。您如何在项目中做到这一点?
【问题讨论】:
标签: asp.net asp.net-mvc http-post viewmodel