重命名ViewModel的属性时,Knockout.js绑定会被破坏

时间:2016-03-16 07:59:06

标签: javascript c# asp.net-mvc mvvm knockout.js

这是我第一次在这里提问,所以请宽容:)

在由knockout.js启动的MVC Web应用程序中,我有一个明显的例子:

  1. C#中的简单ViewModel类:

    public class RetailCustomer
    {
        public DateTime BirthDate { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
  2. MVC视图中的knockout.js中的简单绑定:

    function CustomerCtxViewModel() {
        var self = this;
        self.FirstName = ko.observable('');
        self.LastName = ko.observable('');
        self.BirthDate = ko.observable('');
        $.getJSON("/api/RetailContext", function (data) {
            self.FirstName(data.FirstName);
            self.LastName(data.LastName);
            self.BirthDate(data.BirthDate);
        }
    }
    
  3. 然后我将BirthDate类中的属性RetailCustomer重命名为Birthdate,因为代码分析告诉了我......当然,绑定不再起作用了,最糟糕的是事情是我只在运行时发现它。

    问题:是否有任何工具,技术可以及早提醒我,在编译期间或自动构建期间,以便我可以在应用运行之前看到我的错误?

3 个答案:

答案 0 :(得分:1)

超酷是正确的:绑定在运行时发生,而viewmodel是一个动态对象,因此没有实际的方法来确保viewmodel和必需的绑定在编译/构建时匹配。 / p>

原则上,如果您使用TypeScript,构建过程可以分析HTML并从中推断出一个接口,然后可以将其应用于您的视图模型,但即使这样也只是一般applyBindings的大小写,它适用于整个HTML文档。 applyBindings可用于单个HTML元素。这将是一个非常复杂的系统,据我所知,并没有尝试过任何类似的系统。

答案 1 :(得分:1)

对于这种情况,您可以使用@ Html.NameFor帮助程序,以防您的数据对象(JSON)与.cshtml文件上的Model类型相同。如果要在编译时验证语法,可以编辑csproj并将 MvcBuildViews 定义为true。这样,你就会知道Razor失败时的编译时间。如果编译有问题,请检查this question

答案 2 :(得分:1)

我没有使用它,但T4TS可以从C#类生成TypeScript接口定义。

C#:

[TypeScriptInterface]
public class RetailCustomer
{
    public DateTime BirthDate { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

JavaScript的:

$.getJSON("/api/RetailContext", function (data: T4TS.RetailCustomer) {
    self.FirstName(data.FirstName);
    self.LastName(data.LastName);
    self.BirthDate(data.BirthDate);
}

我还发现TypeLITE的功能大致相同。