我目前正在尝试弄清楚如何将MVC 3视图中的多个字段绑定到1 视图模型上的属性以及尝试实现此目的时的建议。
使用一个例子来说明准备一些东西所需的分钟数。
表单可能如下所示:
准备时间 - 小时:[1]分钟:[30]
并且提交的表单值需要转换为分钟并绑定到ViewModel的PreparationTimeInMinutes属性。
ViewModel属性:
public short PreparationTimeInMinutes { get; set; }
并且View强烈地键入ViewModel,目前具有以下内容:
<div class="editor-label">
@Html.LabelFor(model => model.PreparationTimeInMinutes)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PreparationTimeInMinutes)
@Html.ValidationMessageFor(model => model.PreparationTimeInMinutes)
</div>
为了实现这一目标,我开始考虑以下几点。
有没有人对此类事情的最佳做法有任何建议?或者如果我离开了。
请告诉我。感谢
答案 0 :(得分:2)
Javascript不错但不是真正的MVCish。我认为更好的方法是使用这两个字段的视图模型或使用编辑器/显示模板创建一个新类。
我同意SLaks;你可以创建一个自定义模型绑定器来处理这个,但它可能是矫枉过正。我为一个类型创建了一个自定义绑定器,其中包含一个日期和两个基于this article的类型,尽管我的更简单。但是,如果您只是想要练习或了解有关模型绑定的更多信息,那么它是可行的。
编辑:对不起,万一你决定尝试使用ModelBinder路由,那个例子有点旧(可能是MVC 1 ?!)。我忘记了必须进行其他修改。 These links应该有助于更新该示例。祝你好运。答案 1 :(得分:1)
您应该使用第一个选项 这正是编辑器模板的用途。
如果需要,可以创建自定义ModelBinder以将两个POSTed值绑定到一个数字(以及类似的编辑器模板),并将属性应用于该属性以选择该ModelBinder。 然而,这可能是过度的。
答案 2 :(得分:0)
谢谢SLaks。
使用第一个选项,我在视图模型中执行了以下操作
public TimeInMinutesViewModel PreparationTimeInMinutes { get; set; }
制作此视图模型
public class TimeInMinutesViewModel {
public string Label { get; set; }
public short Hours { get; set; }
public short Minutes { get; set; }
}
和此编辑器模板
@model TimeInMinutesViewModel
<div>@Html.LabelFor(x => x.Label)</div>
<div class="editor-label">@Html.LabelFor(x => x.Hours)</div>
<div class="editor-field">@Html.EditorFor(x => x.Hours)</div>
<div class="editor-label">@Html.LabelFor(x => x.Minutes)</div>
<div class="editor-field">@Html.EditorFor(x => x.Minutes)</div>
并在视图中
@Html.EditorFor(model => model.PreparationTimeInMinutes)
@Html.ValidationMessageFor(model => model.PreparationTimeInMinutes)
我还没有对此进行测试,我可能需要对标签进行一些更改,但这看起来可能适用于我想要使用此方法的2个不同属性。
我现在遇到的问题是能够将这些映射到我的实体属性,这是一个简短的int。
我正在使用AutoMapper,所以我希望这可以使用自定义类型转换器,至少在1个方向,但我不确定两个方向:(