Проблема с настройкой шаблона SPA AngularJS с помощью Web Api

Я пытаюсь использовать шаблон VS 2013 AngularJS SPA с Web Api, но приложение никогда не входит в мой контроллер, даже если оно входит в раздел app.js, который вызывает этот контроллер, вот моя настройка:

WebApiConfig.cs внутри папки App_Start

using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
//using System.Web.Mvc;

namespace App.TheForm
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

FormController.cs внутри папки Controllers:

namespace App.TheForm.Controllers
{
    public class FormController : ApiController
    {
        public IEnumerable<Dictionary<string, object>> GetFormList()
        {
            List<DataRow> formList = new List<DataRow>();
            SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=MyConnection;Initial Catalog=Forms;Integrated Security=True");

            con.Open();
            SqlCommand cmd = new SqlCommand("sp_Get_FormList", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter pFormId = new SqlParameter("@FormId", 3);

            cmd.Parameters.Add(pFormId);

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();

            try
            {
                da.Fill(dt);
                itList<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;

                foreach (DataRow dr in dt.Rows)
                {
                    row = new Dictionary<string, object>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        row.Add(col.ColumnName, dr[col]);
                    }
                    rows.Add(row);
                }
                return rows;
            }
            catch (Exception ex)
            {

            }
            finally
            {
                cmd.Dispose();
                con.Close();
            }

            return null;
        }            
    }
}

Контроллер AngularJS:

app.controller('FormController', function ($scope, $http) {
    $http.get('api/form/getformlist').success(function (data) {
        $scope.formlList = data;
    }).error(function () {
        alert('Error reading JSON file.');
    });

    }
});

index.cshtml

@{
    PageData["title"] = "AngularJS SPA Template for Visual Studio";
}
<h2>Welcome!</h2>
<p>This is just a demo page.</p>

<table ng-app="app" border="1" ng-controller="FormController">
    <tr ng-repeat="form in formlList" ng-class-odd="'odd'" ng-class-even="'even'">
        <td>
            {{form[0]}}
        </td>
        <td>
            {{form[1]}}
        </td>
    </tr>
</table>

RouteConfig.cs внутри App_Start:

namespace App.TheForm
{
    using System.Web.Routing;

    using App.TheForm.Routing;

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.Add("Default", new DefaultRoute());
        }
    }
}

Любая помощь приветствуется.

ОБНОВЛЕНИЕ: эта проблема возникает только при использовании шаблона AngularJS SPA. Когда я воссоздаю этот проект, используя пустое веб-приложение с веб-API, все работает нормально. Я думаю, что шаблон AngularJS SPA портит конфигурацию и маршрутизацию проекта.


comment
Можете ли вы опубликовать соответствующий HTML?   -  person Claies    schedule 27.02.2015
comment
только что разместил это внизу моего вопроса   -  person superconsultant    schedule 27.02.2015
comment
ваш шаблон маршрута в WebAPI выглядит странно.... api/{controller}/{id} не будет совпадать с вашим маршрутом, api/{controller}/{action}   -  person Claies    schedule 27.02.2015
comment
Я НАСТОЯТЕЛЬНО рекомендую использовать маршрутизацию атрибутов в WebAPI2. asp.net/web-api/overview/web-api-routing-and-actions/   -  person Claies    schedule 27.02.2015
comment
изменил его на config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}", defaults: new { action = RouteParameter.Optional }, но без изменений   -  person superconsultant    schedule 27.02.2015
comment
показывает ли http://yourserver.com/api/form/getformlist необработанные данные, если вы просматриваете их в своем браузере?   -  person Claies    schedule 27.02.2015
comment
нет, как я уже говорил ранее, он не попадает внутрь кода getformlist, я также заметил, что, поскольку я использую шаблон SPA AngularJS, он создал RouteConfig.cs внутри App_Start, возможно, это вызывает эту проблему, я добавил его код в конец моего вопроса. Спасибо за помощь.   -  person superconsultant    schedule 27.02.2015
comment
Давайте продолжим обсуждение в чате.   -  person Claies    schedule 27.02.2015
comment
Я изменил его на чат.   -  person superconsultant    schedule 27.02.2015


Ответы (2)


Используйте $http.get('api/form') вместо $http.get('api/form/getformlist') на стороне клиента.

person zhimin    schedule 01.03.2015
comment
zhimin, спасибо за помощь. Я пробовал, но результат тот же. Особенно, когда есть несколько методов GET. Я думаю, что проблема где-то в конфигурации, так как приложение, похоже, не знает о местонахождении api/form. - person superconsultant; 02.03.2015

Я бы изменил это на:

[RoutePrefix("api/form")]
public class FormController : ApiController
{
    [Route("getFormList")]
    public IEnumerable<Dictionary<string, object>> GetFormList()

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

person peinearydevelopment    schedule 02.03.2015
comment
К сожалению, нет, как я упоминал в разделе ОБНОВЛЕНИЕ вверху, кажется, что шаблон AngularJS SPA вызывает проблему. - person superconsultant; 03.03.2015
comment
Какой это шаблон? Можете ли вы опубликовать ссылку на него? - person peinearydevelopment; 03.03.2015
comment
Я получаю этот шаблон, когда решил создать новый проект в разделе Templates-›Visual C#-›Web в Visual Studio Premium 2013. Он называется AngularJS SPA Template. - person superconsultant; 04.03.2015
comment
Я предполагаю, что у вас есть надстройка, которая обеспечивает это, потому что у меня нет этого шаблона. - person peinearydevelopment; 05.03.2015
comment
Может быть, я скачал его некоторое время назад из раздела онлайн-шаблонов. - person superconsultant; 05.03.2015
comment
вы должны были бы сообщить мне, какая надстройка у вас есть. без него сложно сказать что не так - person peinearydevelopment; 06.03.2015
comment
Ошибки в консоли есть? Кроме того, как выглядит вызов на вкладке сети вашего браузера? - person peinearydevelopment; 06.03.2015
comment
peinearydevelopment спасибо за вашу помощь, но на данный момент я просто вернулся к использованию проекта WebApi и ручному созданию SPA, и он отлично работает. - person superconsultant; 07.03.2015