将多个字段绑定到MVC 3视图模型的同一属性

时间:2012-04-03 22:34:33

标签: c# asp.net-mvc-3

我目前正在尝试弄清楚如何将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>

为了实现这一目标,我开始考虑以下几点。

  1. 将PreparationTimeInMinutes属性更改为具有小时和时间的ViewModel。分钟 属性并为其创建编辑器和显示模板 MVC3可以解决绑定和验证吗?
  2. 在准备时使用javascript和隐藏字段。
  3. 其他一些方法可以让你使用MVC模型绑定来做这类事情吗?
  4. 有没有人对此类事情的最佳做法有任何建议?或者如果我离开了。

    请告诉我。感谢

3 个答案:

答案 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个方向,但我不确定两个方向:(