2013-08-21 109 views
0

我一直在试图实现大卫海登的果园CMS和ASP .NET Web API http://www.davidhayden.me/blog/orchard-cms-and-asp.net-web-api,但我遇到了问题,基本上得到一个页面找不到。果园cms apicontroller,返回xml

这是我有:

在我的控制器

ContactViewModel.cs

namespace Sunkist.ContactManager.Controllers 
{ 
public class ContactsController : ApiController 
{ 
    private readonly IContentManager _contentManager; 

    public ContactsController(IContentManager contentManager) 
    { 
     _contentManager = contentManager; 
    } 

    public IEnumerable<ContactViewModel> Get() 
    { 
     return _contentManager 
      .Query(VersionOptions.Published, "Contact") 
      .List() 
      .Select(c => new ContactViewModel(c)); 
    } 

    public ContactViewModel Get(int id) 
    { 
     var contact = _contentManager.Get(id); 

     if (contact == null) 
      throw new HttpResponseException 
       (new HttpResponseMessage(HttpStatusCode.NotFound)); 

     return new ContactViewModel(contact); 
    } 
} 
} 

视图模型文件夹 ViewModel.cs

namespace Sunkist.ContactManager.ViewModel 
{ 
    public class ContactViewModel 
    { 
    private Orchard.ContentManagement.ContentItem c; 

    public ContactViewModel(Orchard.ContentManagement.ContentItem c) 
    { 
     // TODO: Complete member initialization 
     this.c = c; 
    } 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    } 
} 

和迁移

namespace Sunkist.ContactManager { 
    public class Migrations : DataMigrationImpl { 

    public int Create() { 
     // Creating table ContactRecord 
     SchemaBuilder.CreateTable("ContactRecord", table => table 
      .ContentPartRecord() 
      .Column("Name", DbType.String) 
      .Column("Address", DbType.String) 
      .Column("City", DbType.String) 
     ); 

     return 1; 
    } 
    } 
} 

我是新来的果园和.Net MVC,所以我不知道我在做什么错了?

+0

你会得到一个404,当你去哪里? –

+0

当我尝试点击该页面时:http:// localhost:30321/OrchardLocal/api/sunkist.contactmanager/contacts – jmorrissette

+0

您确定这是您的操作的正确网址吗?您是否创建了自定义路线? “api”部分来自哪里?根据您链接的文章,如果您创建了该路线,它应该是/ api/contacts。 –

回答

0

仔细检查包含Web API控制器的模块的名称。

通过VS GUI,我创建了一个新的web api控制器类“TestController.cs”,并找不到正确的端点url。

也就是说,直到我看到项目中的Module.txt,我添加了控制器。该项目是“Orchard.Users”,但Module.txt文件中的名称只是“用户”。

我能够击中“http://example.com/api/users/test”的终点。

值得注意的是:我在“.../UsersApi”设置了一个路由,但'自动魔术'URL模式仍然有效。下面的代码。此外,我后来添加了一个新模块来包含我的api控制器,直到我在仪表板中启用该模块才会工作。

TestController.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

namespace Orchard.Users.Controllers 
{ 
    public class TestController : ApiController 
    { 
     // GET api/<controller> 
     public IEnumerable<string> Get() 
     { 
      return new string[] { "value1", "value2" }; 
     } 

     // GET api/<controller>/5 
     public string Get(int id) 
     { 
      return "value"; 
     } 

     // POST api/<controller> 
     public void Post([FromBody]string value) 
     { 
     } 

     // PUT api/<controller>/5 
     public void Put(int id, [FromBody]string value) 
     { 
     } 

     // DELETE api/<controller>/5 
     public void Delete(int id) 
     { 
     } 
    } 
} 

HttpRoutes.cs

using System.Collections.Generic; 
using Orchard.Mvc.Routes; 
using Orchard.WebApi.Routes; 

public class HttpRoutes : IHttpRouteProvider 
{ 

    public void GetRoutes(ICollection<RouteDescriptor> routes) 
    { 
     foreach (RouteDescriptor routeDescriptor in GetRoutes()) 
     { 
      routes.Add(routeDescriptor); 
     } 
    } 

    public IEnumerable<RouteDescriptor> GetRoutes() 
    { 
     return new[] { 
       new HttpRouteDescriptor { 
        Name = "UsersApi", 
        Priority = -10, 
        RouteTemplate = "usersapi/{id}", 
        Defaults = new { 
         area = "Orchard.Users", 
         controller = "Test", 
         id = RouteParameter.Optional 
        }, 
       } 
      }; 
     } 
    }