是否可以使用ApiController来调用Controller中编写的Action?

时间:2013-09-07 13:38:13

标签: asp.net-mvc visual-studio asp.net-mvc-controller

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

最后我想有这样的事情:

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中的多层解决方案 我在一个专门的项目中有控制器,而我想让ApiControllers在另一个项目中。

2 个答案:

答案 0 :(得分:2)

当然!因此,对于与您想要呈现的视图相关的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方法,如果你需要一个完整的代码片段来看看如何将这一切包装在一起让我知道!但我希望这会让你朝着正确的方向前进!

答案 1 :(得分:1)

如果我正确理解了这一点,你可以选择几个选项。

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

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

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

希望这有帮助!