【发布时间】:2011-02-08 06:55:04
【问题描述】:
这是一个场景:
我有一个自动完成插件(自定义),它保留 JSON 对象的隐藏字段(使用特定结构)。
我创建了一个 Html 帮助程序,可以帮助我轻松绑定到特定的自定义模型(基本上,它有一个用于双向绑定的 JSON 属性和一个让我将 JSON 反序列化为适当结构的属性):
public class AutoCompleteModel {
public string JSON { get; set; }
public IEnumerable<Person> People {
get {
return new JavaScriptSerializer().Deserialize<Person>(this.JSON);
}
set {
this.JSON = new JavaScriptSerializer().Serialize(value);
}
}
}
这很好用,我可以使用默认绑定器@Html.Autocomplete(viewModel => viewModel.AutoCompleteModelTest) 对绑定进行建模。 HTML 助手生成 HTML 如下:
<input type="text" id="AutoCompleteModelTest_ac" name="AutoCompleteModelTest_ac" value="" />
<input type="hidden" id="AutoCompleteModelTest_JSON" name="AutoCompleteModelTest.JSON" value="{JSON}" />
问题是这对消费者来说不是最好的方式。他们必须手动将 People 属性设置为 Person 结构数组。在我的数据层中,我的域对象可能不会存储完整的结构,只有人的 ID(公司 ID)。如果只给出一个 ID,自动完成功能将负责查找此人本身。
最好的情况是这样称呼它:
@Html.Autocomplete(domainObject => domainObject.PersonID) 或
@Html.Autocomplete(domainObject => domainObject.ListOfPersonIDs
我希望它对字符串属性和自定义 AutoCompleteModel 起作用。自动完成器仅更新单个隐藏字段,并且该字段名称在回发时传回(值类似于:[{ "Id":"12345", "FullName":"A Name"},{ "Id":"12347", "FullName":"Another Name" }])。
当然,问题在于这些域对象属性只有一个 ID 或 ID 数组,而不是完整的 Person 结构(因此不能直接序列化为 JSON)。在 HTML 帮助器中,我可以将这些属性值转换为结构,但我不知道如何在 POST 上将其转换回简单类型。我需要的解决方案是在页面加载时将 ID 转换为新的 Person 结构,将其序列化到隐藏字段中。在 POST 上,它会将生成的 JSON 反序列化回一个简单的 ID 数组。
自定义模型绑定器是我需要的解决方案吗?我如何告诉它同时使用自定义模型和简单类型(因为我不希望它应用于每个字符串属性,只需要它来处理 HTML 助手给出的值)。
【问题讨论】:
标签: model-view-controller model-binding