【问题标题】:MVC Model Binding Persisting Complex Properties on ModelMVC 模型绑定模型上的持久复杂属性
【发布时间】:2012-06-21 18:40:53
【问题描述】:

我有以下设置

public class Profile
{
    //Some Properties

    //Some Methods
}

/*Model Class*/
public class LineItem
{
    public Profile Profile {get;set;}
}

在我的控制器中。我有以下两个操作

public ActionResult GetRequest(){

    LineItem model = new LineItem();
    model.Profile = new Profile(){/*Initialize Properties*/};
    return View(model);
}

public ActionResult PostRequest(LineItem item(){
      item.Profile ....  /*Profile Is Null*/
      return View(...);
}

我已验证 LineItem 模型类上的 Profile 属性已在 GetRequest 上设置,并返回到视图,但我想知道在提交该模型时如何保留该复杂属性。我知道人们通常使用隐藏字段进行模型持久性,并且会话也可用,但似乎我有时应该能够告诉 ModelBinder(可能通过属性或注释)在我的模型上持久化复杂的属性。

如何做到这一点?

【问题讨论】:

  • 您是否尝试过创建实现 IModelBinder 接口的自定义模型绑定器?
  • 默认的ModelBinder 将设置任何与 POST 参数匹配的属性。因此,如果您没有特定属性的输入元素,它不会在 GET/POST 之间持续存在。
  • 我正计划这样做,但我想确定一种方法来使这个过程相当透明。感谢您的帮助。

标签: asp.net-mvc asp.net-mvc-3 model-binding


【解决方案1】:

您可以使用 @Html.HiddenFor(model => model.Profile.Id) @Html.HiddenFor(model => model.Profile.Name) 等来为您需要持久化的 Model.Profile 的每个属性。您不应该触摸模型绑定器 - 它将使用标准模型绑定器自动绑定。 如果您使用其他 html 帮助程序,它会为某些属性生成输入标签 - 您不应为此属性使用 @Html.HiddenFor()

【讨论】:

  • 这行不通,如果你看看我的问题,我并不特别担心 Id,我担心的是整个 Profile 属性。如果我要使用这种方法,我需要为每个属性提供一个隐藏输入,这对于大型复杂对象不太实用。
  • 如果出现问题,您可以为profile类编写自己的序列化逻辑,使用隐藏字段来存储此序列化,并为此类创建自定义模型绑定器以将隐藏字段反序列化为属性。但它看起来像网络表单中的 ViewState。想想你的个人资料类做所有这些工作太复杂了,你需要为其他类重用这个解决方案。使用 N 次 Html.Hidden 调用更简单。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多