4

我已经在我的控制器中编写了一些操作,但我需要使用它们,因为它们是 API。
所以我想知道是否可以在 ApiController 中调用单个控制器动作。

最后我想要这样的东西:

public MyController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    //or any more complex action
}


public MyApis : ApiController
{
    // some code that returns the same
    // MyController/Index/View result as an API URI     
}

这种选择的主要原因是我正在 VisualStudio 中开发多层解决方案。
我在一个专门的项目中有控制器,而我想在另一个项目中有 ApiController。

4

2 回答 2

3

当然!因此,对于与您想要呈现的视图相关的 Action 方法,您将编写类似这样的基本内容。

没有进程的控制器。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    //or some model initiation if needed
    public ActionResult Index(ViewModel model)
    {
        return View(model);
    }
}

然后,您可以从这里开始创建 API 控制器方法,就像为 ActionResult 方法创建的一样,唯一的区别是返回类型。您的 api 控制器应该对应于您打算对其运行查询的任何模型实例。就个人而言,我更喜欢创建一个与每个数据库抽象相关的模型,即。ContactController、AccountController 等。

    private readonly IRepository repo;

    //This is a generic repository I do not know if you are using this methodology.
    //but this is strictly for demo purposes.
    public ValuesController(IRepository<SomeModel> repo)
    {
        this.repo = repo;
    }
    public IEnumerable<SomeModel> Get()
    {
        var commands = repo.GetAll();
        return commands.ToList();
    }

    // GET api/values/5
    public IQueryable<SomeModel> Get(int id)
    {
        var commands = repo.GetAll().AsQueryable();
        return commands;
    }

    // POST api/values
    public HttpResponseMessage Post(SomeModel model)
    {
        repo.Add(model);

        var response = Request.CreateResponse<SomeModel>(HttpStatusCode.Created, model);

        string uri = Url.Link("DefaultApi", new { id = model.Id});

        response.Headers.Location = new Uri(uri);

        return response;
    }

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

    // DELETE api/values/5
    public void Delete(int id)
    {
    }

如您所见,这是从 Empty Api 控制器类构建的。最后,您可以通过运行以下 Jquery 代码从您想要的任何视图调用您的 api 控制器。

self.get = function () {
        $.ajax({
            url: '/api/Values',
            cache: false,
            type: 'GET',
            contentType: 'application/json; charset=utf-8',
            data: {},
            success: function (data) {
                //Success functions here.
            }
        });
    }

至于你的发帖方式……

self.create = function (formElement) {
        $.ajax({
            url: '/api/Values',
            cache: false,
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: ko.toJSON(Command),
            success: function (data) {
              //Success function here.
            }
        }).fail(
                //Fail function here.
                 });

如果您需要完整的代码片段来了解如何将所有这些与敲除一起包装,这里的 javascript 来自 knockout.js 方法,请告诉我!但我希望这会让你朝着正确的方向前进!

于 2013-09-09T16:44:09.927 回答
1

如果我正确理解这一点,您有几个可用的选项。

我建议的第一个是您创建一个包含所有 api 控制器的单独文件夹。从这里您可以从 ActionResult 方法中提取您的流程并相应地进行调用。

或者您可以将控制器类型从 ActionResult 更改为 JsonResult。

public JsonResult DoStuff()
{
   // some code that returns the same
   return Json(new { Data = model } , JsonRequestBehavior = JsonRequestBehavior.AllowGet);
}

希望这可以帮助!

于 2013-09-08T05:57:18.890 回答