アプリ全体で、Reading に関連するすべての機能に Razor を使用し、CUD 操作には knockoutJS と AJAX を活用したいと考えています。
プロフィール ビューで、次のことを行いました。
<div>
<h4>About Me</h4>
<!-- ko if: !isEditingAboutMe() -->
<p>@Model.User.AboutMe</p>
@if (Model.CurrentUserCanEdit)
{
<a data-bind="click: editAboutMe">edit</a>
}
<!-- /ko -->
<!-- ko if: isEditingAboutMe() -->
@Html.TextBoxFor(model => model.User.AboutMe, new { data_bind = "value: aboutMe" })
<a data-bind="click: saveAboutMe">save</a>
<a data-bind="click: cancelAboutMe">cancel</a>
<!-- /ko -->
</div>
このようにして、検索エンジンは少なくともコンテンツをクロールでき、JavaScript が有効になっているユーザーは CUD 操作を実行できます。
上記の私の問題は、AJAX を使用して「保存」をクリックした場合、新しい値を Razor モデルにバインドする方法 (4 行目) です。
対応JS:
function ProfileVm() {
var self = this;
self.aboutMe = ko.observable();
self.saveAboutMe = function() {
// AJAX call, after success close the field
self.isEditingAboutMe(false);
};
self.cancelAboutMe = function() {
// just for testing, would revert the value in practice
self.isEditingAboutMe(false);
};
self.isEditingAboutMe = ko.observable(false);
self.editAboutMe = function() {
self.isEditingAboutMe(true);
};
}
$(document).ready(function () {
ko.applyBindings(new ProfileVm());
})
また、このアプローチの「妥当性」に関するフィードバックも歓迎します。