Ошибка Backbone 404, если контроллер C# изменен на ApiController

Я пытаюсь изучить .Net и backbone.js. Я работаю над очень простым проектом; это для перечисления всех получателей, а также для обновления их адресов и прочего. У меня есть RecipientsController, который просто получает список получателей из базы данных. Вот контроллер.

public ActionResult GetAllRecipients()
{
    var recipients = dbContext.Recipients.ToList();
    return Json(recipients, JsonRequestBehavior.AllowGet);

}

Это отлично работает; мое магистральное приложение может получать JSON и правильно их отображать. Но я не мог заставить редактирование (PUT) работать. Итак, я погуглил об этом и наткнулся на учебник, в котором вместо контроллера использовался ApiController. Я решил попробовать, поэтому я изменил контроллер на ApiController.

public IEnumerable<Recipients> GetAllRecipients()
    {

        return dbContext.Recipients.AsEnumerable();

    }

Когда я пытаюсь использовать ApiController, магистраль выдает ошибку 404. Я не понимаю, почему.

Это мое

HomeController: 
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Recipients()
        {
            return View();
        }

И у меня есть два представления (индекс и получатели), оба находятся в разделе «Представления/Домой». Это мой ActionLink:

<li>
     <a id="recipients">@Html.ActionLink("Admin", "Recipients", "Home")</a>
</li>

Теперь, с ApiController, если я изменю ActionLink с Home на Recipients, Recipients на GetRecipients и перемещу View (Recipients) из-под Home в новую папку Recipients, тогда это сработает, но не использует мои основные представления. Я действительно смущен. Может кто-нибудь объяснить это для меня, чтобы я мог понять? Поскольку я учусь, мне было трудно понять некоторые описания, которые я нашел в Интернете (это было слишком сложно для меня), но также я не уверен, что объяснение, которое я нашел, было тем, что мне было нужно.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Вот мой маршрут:

    routes.MapRoute(
        "Recipients", 
        "{Controller}/{action}",
        new { Controller = "Recipients", action = "GetAllRecipients", id = UrlParameter.Optional },
        new { httpMethod = new HttpMethodConstraint("GET") }
    );

person user1828605    schedule 28.06.2014    source источник
comment
Что есть в ваших маршрутах?   -  person Patrick Huber    schedule 29.06.2014
comment
@PatrickHuber Я добавил маршруты   -  person user1828605    schedule 29.06.2014
comment
Я думаю, что это может быть связано с соглашением. asp. net/web-api/обзор/web-api-routing-and-actions/. Вам не нужно специально сопоставлять маршрут, соглашение WebApi заключается в том, что {Method}All{Controller} сопоставляется с METHOD : /{controller}. Я думаю, вам нужно добавить MapHttpRoute, как показано в ссылке.   -  person Patrick Huber    schedule 01.07.2014


Ответы (1)


Backbone будет выполнять PUT только в том случае, если модель имеет атрибут ID, это соглашение магистрали, которое знает, как POST или SAVE данные.

Возможно, магистраль пытается опубликовать данные на сервере и возвращает 404, потому что у вас нет действия для POST. Когда вы получаете данные в свою модель, попробуйте вернуть с сервера атрибут ID.

Представьте, что вы возвращаете этот класс по GET. пример:

public class testDTO()
{   
   long ID {get;set;}
   string Something { get;set;}

}

Прочитайте http://backbonejs.org/#Model-save.

Надеюсь, поможет.

person rcarvalho    schedule 29.06.2014