1

从技术上讲,我已经得到了这个问题的答案,但不幸的是不是我正在寻找的答案。我不得不接受它,因为那个人一直和我一起工作,付出了很多努力。在这里,我要求同一个 qn 专门获得我所追求的答案:

我所追求的是一种在 Knockout 视图模型上表达模型字段验证的声明性方式:

拥有这个 MVC 视图模型:

public class Email
{
  public string Selected { get; set; }
  public string Name { get; set; }
}

public class User
{
  public string UserName { get; set; }
  public IList<Email> Emails { get; set; }
}

并有这个淘汰赛viewModel

var viewModel = {
  UserName: ko.observable("@Model.UserName"),
  Emails: ko.observableArray(@Html.Json(@Model.Emails) || []),

  // How to express these: ???
  // Email.Selected: ko.observable().extend({ required: true })
  // Email.Name: ko.observable().extend({ required: true, email: true })

}

我需要在 Knockout 中进行哪些更改才能viewModel声明方式表达这一点。本质上,它归结为viewModel以与 MVC 类似的方式表达 Knockout,但在该模型的字段上使用Knockout验证(而不是MVC 数据注释)。

在你回答之前,请阅读到最后,它的文字不多,但我在这里寻找一些具体的东西。

4

1 回答 1

1

我会有一个电子邮件视图模型,

var Email = 
{
    Selected: ko.observable().extend({ required: true }),
    Name: ko.observable().extend({ required: true, email: true })
}

然后使用映射插件自动为您填充它:

var viewModel = function()
{
    var self = this;
    self.UserName: ko.observable("@Model.UserName");
    var mapping = {
    'Emails': {
        create: function(options) {
            return new Email(options.data);
        }
     }
     self.Emails= ko.mapping.fromJSON(@Html.Json(@Model.Emails), mapping);
}

请注意,我认为您需要使您的视图模型成为一个函数而不是一个直接的 JS 对象,因为我认为它不会起作用。

于 2013-03-12T14:30:10.633 回答