这是我第一次在这里提问,所以请宽容:)
在由 knockout.js 提供支持的 MVC Web 应用程序中,我有,作为明确的例子:
-
C# 中的简单视图模型类:
public class RetailCustomer { public DateTime BirthDate { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
-
在 MVC 视图上挖空.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
,因为代码分析告诉我......当然,绑定不再起作用,最糟糕的是我只在运行时发现它。
问:是否有任何工具、技术可以在编译时或自动化构建期间及早警告我,以便我可以在应用程序运行之前看到我的错误?
super cool 是正确的:绑定发生在运行时,视图模型是一个动态对象,因此没有实用的方法可以确保视图模型和所需的绑定在编译/构建时匹配。
原则上,如果您使用的是 TypeScript,构建过程可以分析 HTML 并从中推断出一个接口,然后可以将其应用于您的视图模型,但即使这样也只是applyBindings
适用于整个 HTML 文档的一般情况。 applyBindings
可用于单个 HTML 元素。这将是一个非常复杂的系统,据我所知,从未尝试过。
对于这种情况,可以使用 @Html.NameFor 帮助程序,以防数据对象(JSON)与 .cshtml 文件上的模型类型相同。如果要在编译时验证语法,可以编辑 csproj 并将 MvcBuildViews 定义为 true。这样,您将在编译时知道 Razor 何时会失败。如果您在编译时遇到问题,请检查此问题。
我没有用过它,但是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,它的作用大致相同。