REST URL Backbone.js с ASP.NET MVC 3 - PullRequest
       1

REST URL Backbone.js с ASP.NET MVC 3

13 голосов
/ 07 июня 2011

Недавно я просматривал Backbone.js , и сейчас я пытаюсь подключить его к моей серверной asp.net mvc 3.

Это когда я обнаружил проблему. ASP.NET слушает различные действия, например: POST /Users/Create, а не только POST /users/. Из-за этого метод Model.Save() в backbone.js не будет работать.

Как мы должны решить эту проблему? Должен ли я переписать Backbone.Sync?

Ответы [ 4 ]

15 голосов
/ 08 июня 2011

Ответ не переопределять Backbone.sync. Вы редко хотели бы сделать это. Вместо этого вам нужно только воспользоваться свойством url модели, где вы можете назначить функцию, которая возвращает желаемый URL. Например,

Forum = Backbone.Model.extend({

  url: function() {
    return this.isNew() ? '/Users/Create' : '/Users/' + this.get('id');
  }

});

где URL, используемый для модели, зависит от того, является ли модель новой. Если я правильно прочитал ваш вопрос, это все, что вам нужно сделать.

12 голосов
/ 07 июня 2011

Вы должны указать ASP.NET MVC направлять правильные URL-адреса REST или исправить Backbone.sync, чтобы он отправлял запросы GET / POST по соответствующим URL-адресам.

Backbone работает с REST, а не с RESTful URL. Может быть реализация ОС Backbone.sync, которая соответствует вашим URL-адресам.

Рекомендовать URL, которые более удобны при использовании Backbone:

GET     /forums              ->  index
GET     /forums/new          ->  new
POST    /forums              ->  create
GET     /forums/:forum       ->  show
GET     /forums/:forum/edit  ->  edit
PUT     /forums/:forum       ->  update
DELETE  /forums/:forum       ->  destroy
9 голосов
/ 22 декабря 2011

Я недавно написал в блоге 1002 *, в котором описывается, как связать .NET MVC со стандартным уровнем Backbone-сервиса.

Как упоминалось в предыдущих постерах, есть несколько подходов, которые вы можете использовать. Я предпочитаю такой подход, потому что он требует небольшой настройки.

Контроллер:

public class ZocController : Controller
{
    public ActionResult Docs()
    {
        return Json(GetDocs(), JsonRequestBehavior.AllowGet);
    }

    [ActionName("Docs")]
    [HttpPost]
    public ActionResult HandlePostDoc(Doctor doc)
    {
        doc.id = Guid.NewGuid();

        CreateDoc(doc);

        return Json(doc);
    }

    [ActionName("Docs")]
    [HttpPut]
    public ActionResult HandlePutDoc(Doctor doc)
    {
        UpdateDoc(doc);

        return new EmptyResult();
    }

    [ActionName("Docs")]
    [HttpDelete]
    public ActionResult HandleDeleteDoc(Guid id)
    {
        DeleteDoc(id);

        return new EmptyResult();
    }
}

Магистраль

window.Doctor = Backbone.Model;

window.Doctors = Backbone.Collection.extend({

    model: Doctor,

    url: '/zoc/docs'

});
0 голосов
/ 24 мая 2012

я нашел следующий код в https://github.com/sgentile/BackboneContacts

    /// <reference path="backbone.js" />
ModelBase = Backbone.Model.extend({
    defaults: {
        id: null
    },
    url: function (type) {
        //expecting the following conventions on the server:
        //urlRoot should be the controller : controller/
        //create → POST   /action
        //read → GET   /action[/id]
        //update → PUT   /action/id
        //delete → DELETE   /action/id
        var fqUrl = this.urlRoot;
        switch (type) {
            case "POST":
                fqUrl += "create";
                break;
            case "PUT":
                fqUrl += "update";
                break;
            case "DELETE":
                fqUrl += "delete/" + this.get('id');
                break;
            case "GET":
                fqUrl += "read/" + this.get('id');
                break;
        }
        return fqUrl;
    }
});

var methodMap = {
    'create': 'POST',
    'update': 'PUT',
    'delete': 'DELETE',
    'read': 'GET'
};

// Helper function to get a URL from a Model or Collection as a property
// or as a function.
var getUrl = function (object) {
    if (!(object && object.url)) return null;
    return _.isFunction(object.url) ? object.url() : object.url;
};

// Throw an error when a URL is needed, and none is supplied.
var urlError = function () {
    throw new Error('A "url" property or function must be specified');
};

Backbone.sync = function (method, model, options) {
    var type = methodMap[method];

    options.url = _.isString(this.url) ? this.url : this.url(type);

    // Default JSON-request options.
    var params = _.extend({
        type: type,
        dataType: 'json'
    }, options);

    // Ensure that we have a URL.
    if (!params.url) {
        params.url = getUrl(model) || urlError();
    }

    // Ensure that we have the appropriate request data.
    if (!params.data && model && (method == 'create' || method == 'update')) {
        params.contentType = 'application/json';
        params.data = JSON.stringify(model.toJSON());
    }

    // For older servers, emulate JSON by encoding the request into an HTML-form.
    if (Backbone.emulateJSON) {
        params.contentType = 'application/x-www-form-urlencoded';
        params.data = params.data ? { model: params.data} : {};
    }

    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
    // And an `X-HTTP-Method-Override` header.
    if (Backbone.emulateHTTP) {
        if (type === 'PUT' || type === 'DELETE') {
            if (Backbone.emulateJSON) params.data._method = type;
            params.type = 'POST';
            params.beforeSend = function (xhr) {
                xhr.setRequestHeader('X-HTTP-Method-Override', type);
            };
        }
    }

    // Don't process data on a non-GET request.
    if (params.type !== 'GET' && !Backbone.emulateJSON) {
        params.processData = false;
    }

    // Make the request.
    return $.ajax(params);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...