【问题标题】:How to create reusable controls using knockout, jquery, and ASP.NET MVC?如何使用敲除、jquery 和 ASP.NET MVC 创建可重用控件?
【发布时间】:2011-12-08 22:17:52
【问题描述】:

我想创建可重用的控件,用于淘汰赛/jquery/asp.net mvc 页面

例如,各种项目可以进行讨论(cmets 列表)。我想要一个处理显示和添加 cmets 等的讨论控件。

最初的想法是使用局部视图来注入 html,然后使用 .js 文件和一些 javascript 来设置淘汰视图模型。不过,它似乎有点笨拙。我只是想知道是否有人有一个非常好的方法来完成所有这些并将其打包为一个很好的控件?

【问题讨论】:

  • 投票结束,因为没有建设性?我特意询问某人如何使用 asp.net mvc/knocout 和 jquery 创建可重用控件的专业知识。这符合stackoverflow的格式:-)
  • 这个问题太深奥了,有几十种方法可以完成。一旦自定义和选项开始增加复杂性,您就必须开始讨论 API 可用性以及诸如组合与继承之类的事情。
  • 你有什么运气吗?我需要做类似的事情——我使用编辑器模板来呈现子对象的集合。这工作正常,并为 MVC 绑定正确命名每个对象,例如Category.Products[0].ProductName 等。现在我需要弄清楚如何将每个子对象的属性绑定到我的淘汰视图模型。

标签: c# jquery asp.net-mvc knockout.js asp.net-mvc-4


【解决方案1】:

这是一种方法。


您有一个单独的 WebAPI 控制器来处理来自客户端的数据访问。

//Inside your CommentsApiController, for example
public IEnumerable<Comment> Get(int id)
{
    var comments = _commentsService.Get(int id);    //Call lower layers to get the data you need
    return comments;
}

您的 MVC 控制器具有返回 PartialViewResults 的操作。这是一个返回局部视图的简单操作。

//Inside your MVC CommentsController, for example
public PartialViewResult CommentsList(int id)
{
    return PartialView(id);
}

您的局部视图呈现出您的标记,并带有敲除绑定。我们为我们的 HTML 制作了一个唯一的 ID,因此我们可以将我们的淘汰视图模型绑定到页面的这个特定部分(避免与页面上的其他淘汰组件冲突)。 我们需要的 JavaScript(淘汰视图模型等)被包含在内,创建了一个新的 ViewModel 并应用了淘汰绑定。

@{
    var commentsId = Model;    //passed from our MVC action
    var uniqueIid = System.Guid.NewGuid().ToString();
}
<section class="comments" id="@uniqueIid ">
    <ul data-bind="foreach: { data: Comments, as: 'comment' }">
        <li>
            <span data-bind="text: comment.Author"></span>
            <p data-bind="text: comment.Message"></p>
        </li>
    </ul>
</section>


@Scripts.Render("~/js/comments")    //using MVC Bundles to include the required JS
@{
    //generate the URL to our WebAPI endpoint.
    var url = Url.RouteUrl("DefaultApi", new { httproute = "", controller = "Comments", id = commentsId });
}
<script type="text/javascript">
    $(function() {
        var commentsRepository = new CommentsRepository('@url');
        var commentsViewModel = new CommentsViewModel(commentsRepository);

        var commentsElement = $('#@uniqueIid')[0];
        ko.applyBindings(commentsViewModel, commentsElement);
    });
</script>

在我们的 JavaScript 中,我们定义了淘汰视图模型等。

var CommentsRepository = function(url) {
    var self = this;
    self.url = url;

    self.Get = function(callback) {
        $.get(url).done(function(comments) {
            callback(comments);
        });
    };
};

var CommentsViewModel = function (commentsRepository) {
    var self = this;
    self.CommentsRepository = commentsRepository;
    self.Comments = ko.observableArray([]);

    //self executing function to Get things started
    self.init = (function() {
        self.CommentsRepository.Get(function(comments) {
            self.Comments(comments);
        });
    })();
};

我们完成了!要使用这个新组件,我们可以使用RenderAction

@* inside our Layout or another View *@
<article>
    <h1>@article.Name</h1>
    <p>main page content here blah blah blah</p>
    <p>this content is so interesting I bet people are gonna wanna comment about it</p>
</article>
@Html.RenderAction("Comments", "CommentsList", new { id = article.id })

【讨论】:

    【解决方案2】:

    如果,“控制”是指我们习惯于 ASP.NET WebForms 的控制类型,在 ASP.NET MVC 中最接近的东西是HTML Helpers。由于它们基本上只是返回 HtmlString 的常规 .NET 方法,因此您可以轻松地将所需的任何内容打包到包含这些方法以及 embedded resources 的程序集中(适用于 JavaScript、CSS 和图像文件)。

    【讨论】:

    • 不,不像 webforms,虽然目标是相似的......它只是制作一个可重用的组件,它可以与淘汰赛挂钩。 HTML Helpers 很酷,这可能是解决方案的一部分,但淘汰意味着您必须在正确的时间注入客户端创建过程以注入您的“控制”
    【解决方案3】:

    如果您希望自动将您的 html 连接到淘汰赛,请查看我的插件https://github.com/phototom/ko-autobind

    这仍在进行中。要使用它,请查看http://jsfiddle.net/rxXyC/11/ 的演示小提琴。

    您还可以在https://github.com/SteveSanderson/knockout/wiki/Plugins查看一些可用插件的列表

    【讨论】:

    • 我似乎无法让您的演示小提琴工作。另外,鉴于自动绑定存储库更新已经有一段时间了,您能否用已知问题等更新自述文件? :)
    • 你是对的。过几天我回家就修好了。
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2010-12-02
    • 2015-10-07
    • 2011-12-26
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多