我刚刚在当前的项目中遇到过这个话题,我想知道处理问题的最佳方法"在提交表单时使用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,我可以轻松地在我的控件上放置.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);
}
这个对我来说似乎有点脆弱。在post post上我必须调用任何提供视图模型的服务,提取某些对象并将它们附加到我收到的视图模型。
目前我能想到的只是,但简而言之:
我想知道,在整个项目中处理它的最佳做法是什么?可维护性的最佳方法是什么?
对我来说,到目前为止似乎没有完美的解决方案。你如何在你的项目中做到这一点?
答案 0 :(得分:2)
避免解决方案1:您将权衡您的请求,数据可以伪造,如果您的对象不可序列化(或者字符串方法不提供有用的字符串),您将遇到一些问题。如果你想使用类似的东西更喜欢Session
解决方案2:当输入必须根据其他控件值进行过滤时,我使用ajax填充。如果不是这种情况,你将拥有许多行动的控制器,而且不容易维护。
解决方案3是我使用的,我更喜欢,因为它更干,更安全(没有伪造),并使控制器保持亮起。
答案 1 :(得分:0)
只需更改
<input class="ui-input-text " type="text" id="PlateNo" tabindex="2" name="PlateNo">
到
<input class="ui-input-text " type="text" id="PlateNo" tabindex="2" name="PlateNo" value="@Request["PlateNo"]">
您可以在文本框上显示此输入的发送值。
只需将value="@Request["yourinputname"]
添加到您的输入中。