3

我有这样的复杂模型:

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() 仅适用于单个值,不适用于模型。那么有没有办法将模型(或部分)序列化为隐藏字段?

4

3 回答 3

0

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

在 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)
于 2013-07-22T16:39:57.277 回答
0

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

如何为每个子模型创建自定义编辑器模板:如何在 ASP.NET MVC 3 中创建自定义编辑器/显示模板?

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

于 2013-07-22T16:34:45.733 回答
0

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

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

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


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

希望这些方法之一可以有所帮助。

于 2013-07-22T16:37:17.133 回答