这是我第一次在这里提问,所以请宽容:)
在由knockout.js启动的MVC Web应用程序中,我有一个明显的例子:
C#中的简单ViewModel类:
public class RetailCustomer
{
public DateTime BirthDate { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
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);
}
}
然后我将BirthDate
类中的属性RetailCustomer
重命名为Birthdate
,因为代码分析告诉了我......当然,绑定不再起作用了,最糟糕的是事情是我只在运行时发现它。
问题:是否有任何工具,技术可以及早提醒我,在编译期间或自动构建期间,以便我可以在应用运行之前看到我的错误?
答案 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的功能大致相同。