【问题标题】:How to do Knockout validation on complex MVC models in a declarative way?如何以声明的方式对复杂的 MVC 模型进行 Knockout 验证?
【发布时间】:2013-02-28 02:28:07
【问题描述】:

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

我所追求的是一种声明性在 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 中进行哪些更改才能以声明方式表达这一点。 本质上,它归结为以与 MVC 类似的方式表达 Knockout viewModel,但在该模型的字段上使用 knockout validation(而不是 MVC Data Annotations)。

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

【问题讨论】:

    标签: asp.net-mvc knockout.js viewmodel knockout-validation knockout-mvc


    【解决方案1】:

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

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

    然后使用mapping plugin 自动为您填充:

    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 对象,否则我认为它不会起作用。

    【讨论】:

    • 谢谢保罗,我会接受你的回答并尝试嵌入它。将会回来。绝对看起来很有希望。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2014-04-14
    相关资源
    最近更新 更多