3

我目前正在尝试弄清楚如何将 MVC 3 视图中的多个字段绑定到视图模型上的 1 个属性,以及在尝试实现这一点时推荐什么。

使用一个例子来说明准备某事所需的分钟数(仅)。

表单可能如下所示:

准备时间 - 小时:[1] 分钟:[30]

并且提交的表单值需要转换为分钟并绑定到 ViewModel 的 PreparationTimeInMinutes 属性。

视图模型属性:

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. 将 PrepareTimeInMinutes 属性更改为具有小时和分钟属性的 ViewModel 并为其创建编辑器和显示模板,以便 MVC3 可以整理绑定和验证?
  2. 准备时间使用 javascript 和隐藏字段。
  3. 其他一些方法可以让您使用 MVC 模型绑定来做这种事情?

有没有人对这类事情的最佳实践有任何建议?或者如果我很遥远。

请告诉我。谢谢

4

3 回答 3

2

Javascript 还不错,但不是真正的 MVCish。我认为更好的方法是使用这两个字段的视图模型或使用编辑器/显示模板创建一个新类。

我同意 SLaks;您可以创建一个自定义模型绑定器来处理这个问题,但这可能是矫枉过正。我根据这篇文章为一个日期和两次的类型创建了一个自定义活页夹,尽管我的要简单得多。但是如果你只是想练习或者了解更多关于模型绑定的知识,它是可行的。

编辑:抱歉,以防万一您决定尝试 ModelBinder 路线,该示例有点旧(可能是 MVC 1?!)。我忘记了必须进行额外的修改。 这些 链接应该有助于更新该示例。祝你好运。

于 2012-04-03T23:18:35.993 回答
1

您应该使用第一个选项。
这正是编辑器模板的用途。

如果需要,您可以创建自定义 ModelBinder 将两个 POST 值绑定到一个数字(以及类似的编辑器模板),并将属性应用于属性以选择该 ModelBinder。
但是,这可能是矫枉过正。

于 2012-04-03T22:39:36.950 回答
0

谢谢斯拉克斯。

使用第一个选项,我在视图模型中执行了以下操作

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 个不同的属性。

我现在遇到的问题是能够将这些映射到我的实体属性,它是一个短整数。

我正在使用 AutoMapper,所以我希望这将与自定义类型转换器一起使用,至少在 1 个方向上,但我不确定两个方向:(

于 2012-04-03T23:17:51.357 回答