【问题标题】:Mixing MVC Razor and Knockout混合 MVC Razor 和 Knockout
【发布时间】:2013-09-16 23:25:24
【问题描述】:

在我的整个应用程序中,我希望将 Razor 用于与阅读相关的所有功能,并利用 knockoutJS 和 AJAX 进行 CUD 操作。

在我的个人资料视图中,我执行了以下操作:

<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 模型(第四行向下)?

对应的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());
})

另外 - 欢迎就这种方法的“适当性”提供反馈。

【问题讨论】:

  • 你的saveAboutMe函数是做什么的?
  • 它调用一个 AJAX 端点并返回成功或失败。如果成功,则为 isEditing(false),但该值不会反映在视图中。
  • 然后让 Action 返回新更新的模型(以 JSON 格式),并将其重新应用到 Knockout。
  • @haim770 - MVC 动作?我不确定你的意思。
  • 我想我误解了你的问题,请看我的回答。

标签: asp.net-mvc asp.net-mvc-4 knockout.js


【解决方案1】:

目前尚不清楚为什么您将 Knockout 仅用于写入操作 (CUD) 而不是用于读取。这样做可以自动解决您的问题:

代替:

<p>@Model.User.AboutMe</p>

您应该遵循 Knockout 方式,因此您将拥有双向模型绑定:

<p data-bind="text: aboutMe()"></p>

现在,一旦 aboutMe 字段更新,Knockout 将确保 &lt;p&gt; 元素中的数据也将更新。

编辑:

由于您希望用户详细信息的搜索引擎可见性,您可以试试这个:

<p data-bind="text: aboutMe()">@Model.User.AboutMe</p>

这样,服务器响应的简单检索(没有脚本调用)确实会包含所需的文本,但是一旦 Knockout 启动(几乎立即),您仍然可以使用新数据进行完整的模型绑定。

【讨论】:

  • 因为 Google 不会看到该值,禁用 JS 的用户也不会看到。对吗?
  • 非常酷,我喜欢这种方法。现在我只需要将模型数据推送到视图中的剔除 observables 中,对吗?你会认为那很乱(视图中有脚本标签,恶心)?
  • “常规”的做法类似于ko.applyBindings(@Html.Raw(Json.Encode(Model)));,然后将您的模型作为一个整体进行绑定。但如果您只打算更新 aboutMe 字符串并且已经拥有将其发送回服务器的 Ajax,您可以保留当前代码并进行更改(第 4 行):self.aboutMe = ko.observable('@Model.User.AboutMe');
  • 我可以在javascript中做到这一点,而不是视图?那将是神奇的。现在试试..
  • 如果您的ProfileVm 代码位于单独的.js 文件中,则Razor 不会解释@Model.User.AboutMe 行。
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多