【问题标题】:ASP.NET MVC objects lost on post methodASP.NET MVC 对象在 post 方法中丢失
【发布时间】: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


    【解决方案1】:

    避免解决方案 1:你会权衡你的请求,数据可能是伪造的,如果你的对象不可序列化(或者 to string 方法没有提供有用的字符串)你会遇到一些问题。如果你想使用类似的东西更喜欢 Session

    解决方案 2:当必须根据其他控件值过滤输入时,我使用 ajax 填充。如果不是这种情况,您将拥有具有大量操作且不易维护的控制器。

    解决方案 3 是我使用并且我更喜欢的解决方案,因为它更干燥、更安全(无伪造),并且控制器保持轻便。

    【讨论】:

    • 感谢您的回复!所有这些都是有道理的,但我在解决方案 3 中遇到的主要问题很简单 -> 通过 FactoryMethod 创建域模型以确保一致性并将其保存在内存中。现在避免持久化它,因为用户可能会取消创建。现在对象已附加在我的域模型中。我必须通过我的视图模型将它们路由到即将到来的持久性。 Tada -> 我无法调用服务来检索对象,因为我没有持久化它:/你的处理方式是什么......作为一个粗鲁的问题;)
    • @Kaffeepause 我使用持久化(在数据库、临时文件或其他文件中)并且有一个更简洁的方法来查找自一段时间以来未使用的对象
    【解决方案2】:

    改变一下

    <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"] 添加到您的输入中。

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多