【问题标题】:How to serialize model into hidden fields?如何将模型序列化为隐藏字段?
【发布时间】:2013-07-22 15:50:05
【问题描述】:

我有这样的复杂模型:

public class MyModel 
{
    public SubModel SubModel1 {get;set;}
    public SubModel SubModel2 {get;set;}
    public SubModel SubModel3 {get;set;}
}

public class SubModel
{
    public int Field1 {get;set;}
    public string Field2 {get;set;}
}

取决于视图上的某些情况我需要实现下一个逻辑:

@Html.EditorFor(m=>m.SubModel1);
@Html.HiddenFor(m=>m.SubModel2);
@Html.HiddenFor(m=>m.SubModel3);

我的问题是 Html.HiddenFor() 仅适用于单个值,不适用于模型。那么有没有办法将模型(或部分)序列化为隐藏字段?

【问题讨论】:

  • 你能不能把每一个都放在它自己的 div 中,比如<div class="sub1">@Html.EditorFor(m=>m.SubModel1)</div>,然后用 javascript 显示/隐藏你需要的那个?
  • 我会用 XML 序列化整个模型及其子模型,然后在将序列化字符串存储到隐藏字段之前对其进行加密。你做相反的事情来取回原来的模型。

标签: c# asp.net-mvc-3 serialization hidden-field


【解决方案1】:

不确定这是否能解决您的问题,这只是我的一个想法,我的代表不允许我发表评论。

如何为您的每个子模型创建自定义编辑器模板:How to create custom editor/display templates in ASP.NET MVC 3?

然后,您可以在自定义模板中为子模型中的每个属性创建单独的隐藏控件。

【讨论】:

    【解决方案2】:

    嗯...如果您想通过这种方式,您可以考虑将此模型序列化为javascript,而不是尝试序列化为隐藏的输入。 Take a look at this。这是模型序列化到脚本的一个很好的例子。

    另一种方法:如果此模型包含用户最终会看到的数据,也许您应该考虑将其存储在视图中,然后将视图隐藏起来直到显示出来。在这种特殊情况下,如果您可以仅在用户请求时使用 ajax 将模型请求到服务器,那就更好了。

    另一种方法:您可以避免在页面打开期间加载此子模型,并在触发后加载到操作中。


    我不是说你需要,只是为了记录,你可以探索另一种在服务器中短期维护数据的形式:TempData, ViewData and ViewBag

    希望其中一种方法能有所帮助。

    【讨论】:

      【解决方案3】:

      您似乎无法为 HiddenFor 创建您自己的自定义模板,就像您可以为 EditorFor 一样,所以我将创建您自己的部分模板,然后使用它。

      在 Views/Shared/HiddenSubModel.cshtml 中创建一个文件

      @model SubModel
      
      @Html.HiddenFor(m=>m.Field1)
      @Html.HiddenFor(m=>m.Field2)
      

      然后在调用页面中使用这个

      @Html.EditorFor(m=>m.SubModel1);
      @Html.Partial("HiddenSubModel", Model.SubModel2)
      @Html.Partial("HiddenSubModel", Model.SubModel3)
      

      【讨论】:

        猜你喜欢
        • 2010-11-19
        • 2012-07-03
        • 2016-04-16
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 2011-06-08
        • 2011-10-08
        • 2016-08-23
        相关资源
        最近更新 更多