我的模型看起来像这样。
class Aspect {
Guid Id { get; set; }
string Name { get; set; }
string Description { get; set; }
// multiple other properties
}
在我的视图(ASP.NET MVC 3.0)中,我试图使用KnockoutJS映射插件。我这样称呼它。 ( 下列出的Html助手)
// attempt to bind any data we received from the server
var serverData = @Html.Interpret(Model);
// auto map the knockout attributes from the server data
var viewModel = ko.mapping.fromJS(serverData);
// apply the knockout binding to the viewModel
ko.applyBindings(viewModel, $("#__frmAspect")[0]);
// attach the jquery unobtrusive validator
$.validator.unobtrusive.parse("#__frmAspect");
viewModel.Save = function() {
// we will try to send the model to the server.
ko.utils.postJson(
$("#__frmAspect").attr('action'), { model: ko.toJS(viewModel) }
);
};
// bind the submit handler to unobtrusive validation.
$("#__frmAspect").data("validator").settings.submitHandler = viewModel.Save;
在大多数情况下,这确实有效。但是,无论出于何种原因,它都不喜欢Name
字段。
创建,请注意。如果我在knockout.js文件中的postJson
处放置一个断点,我可以坐在那里看到ko.observable()
确实存在。它只是没有被输入字段设置。
有人可以告诉我为什么会这样吗?
我的Html助手:
namespace System.Web.Mvc {
public static class KnockoutHelpers {
public static MvcHtmlString Interpret<TModel>(this HtmlHelper htmlHelper, TModel model) {
return new MvcHtmlString(model.ToJson());
}
}
public static string ToJson ( this object item ) {
return new System.Web.Script.Serialization.JavaScriptSerializer( ).Serialize( item );
}
}
答案 0 :(得分:5)
看起来我们在KO论坛上解决了这个问题。自动填充未在名称字段上触发更改事件。
将数据绑定定义为:data-bind="value: Name, valueUpdate: 'blur'"
以使其正常工作。