【问题标题】:Rich web app using ASP.NET MVC and Backbone.js and progressive enhancement使用 ASP.NET MVC 和 Backbone.js 以及渐进增强的富 Web 应用程序
【发布时间】:2013-10-26 23:16:00
【问题描述】:

我正在使用 mvc 和backbone.js 开发一个小型网络应用程序,我对如何处理异步请求和常规请求有一些想法。

今天我使用一个名为 /pages 的控制器,如果它是一个 ajax 请求,它会返回一个局部视图,如果它是一个常规请求,它会返回一个标准视图。在another question 中,当我将一堆 HTML 发送回客户端时,我被告知我做错了。

那么我应该如何构造我的控制器等来处理异步和非异步请求?

在我的情况下,我的页面控制器中有以下代码

public ActionResult Index() {
    var id = _model.Id;
    var parentId = _model.Parent != null ? _model.Parent.Id : null;
    var viewModel = new IndexViewModel
    {
        RootModel = _session.Query<IPageModel>().SingleOrDefault(model => model.Parent == null),
        CurrentModel = _model,
        ParentModel = parentId != null ? _session.Load<IPageModel>(parentId) : null,
        Children = _session.Query<IPageModel>()
            .Where(model => model.Parent.Id == id)
            .Where(model => !model.Metadata.IsDeleted)
            .OrderBy(model => model.Metadata.SortOrder)
            .ToList()
    };

    if(Request.IsAjaxRequest()) {
        return PartialView(viewModel);    
    }
    return View(viewModel);
}

但是如果我理解正确的话,我最好还是发回一组页面而不是一个完整的视图模型?我应该如何在我的控制器中处理这个问题?

使用例如创建单独的控制器/api 是个好主意吗? mvc 4 中的 api 控制器?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 web-applications backbone.js


    【解决方案1】:

    如果您使用的是 Backbone,那么您应该返回由 PartialView 插入的 JSON,而 PartialView 应该是 Backbone 视图将呈现的页面中的模板。

    【讨论】:

    • 好的,在我的情况下,我应该只返回一个 IPageModels 的集合,还是可以将完整的视图模型发回?我想寄回一个集合是要走的路吗?
    • 这取决于您的视图模板是否从视图模型中获取这些数据是的,否则我将使用集合
    【解决方案2】:

    正如前面在不同答案中提到的,您应该返回 JSON 结果而不是 HTML 视图。JSON Result on MSDNExample of using JSON result

    如果您使用ASP.NET MVC 4(目前为测试版),您可以使用web api 通过ajax/rest 调用以JSON 格式获取数据。

    【讨论】:

      【解决方案3】:

      我同意弗洛里姆的观点。您应该从 MVC 控制器返回 json。 Backbone 在构建时考虑了 REST。因此,您的服务器应该模仿 REST API,并返回 json 供 Backbone 使用。当我使用 MVC 3 和 Backbone 时,我的服务器代码所做的就是返回数据。它通常有一个视图,即主干应用程序视图。 Web 应用程序“视图”是使用从我的控制器返回的数据中的模板呈现的。希望这可以帮助。

      我还没有使用过 MVC 4 Web API,但我确实认为这种情况将是它的理想选择。

      【讨论】:

      • 好的,您对使用backbone.js 和MVC 进行渐进式增强有什么看法?这是一篇关于主题lostechies.com/derickbailey/2011/09/26/…的博文
      • 是否可以使用 razor 视图作为模板,或者我最好使用 jquery 模板或下划线?
      • 我使用下划线的模板并将服务器返回的 json 传递到模板中。他们在演示 todo.js 上的表现完全一样。如果您不想在服务器上构建自己的 REST API,可以考虑使用github.com/ServiceStack/ServiceStack.Examples - 这里是大师们构建的。我以前没有使用过它,但肯定会考虑在未来的应用程序中使用它。我提供的链接中有一个主干示例。它使用 Redis 进行数据访问,但我很确定你可以使用 Entity 或任何你想要的东西。
      【解决方案4】:

      我已经将几个 Backbone 示例一起编译成一个使用 REST 接口的工作 ASP.net MVC 3 应用程序。这是我的tumblr Blog 的链接,我在其中提供了源代码和我用作资源的网站的信息。 Backbone.js 与 MVC 3 配合得非常好,我一直在寻找新的方法来推动这个例子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多