C# MVC和WebAPI使用同一个控制器,有人能解释一下如何使用吗?

C# MVC和WebAPI使用同一个控制器,有人能解释一下如何使用吗?,c#,.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,C#,.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,这是我的控制器- namespace MvcApplication.Controllers { public class HomeController : Controller { public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); }

这是我的控制器-

    namespace MvcApplication.Controllers
    {
      public class HomeController : Controller
      {
         public ActionResult Contact()
         {
           ViewBag.Message = "Your contact page.";
           return View();
         }
         public JsonResult GetPartNumbers()
         {
           var PartNumbers = ProductModel.LoadAllPartNumbers().ToArray();
           return Json(PartNumbers, JsonRequestBehavior.AllowGet);
         }
     }
   }
我没有从ApiController继承。它仍然可以工作,因为它可以返回MVC请求的ActionResult数据类型以及api请求的基本数据类型。这是我的WebApiConfig文件-

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
我正在使用MVC4。现在主要的问题是,我没有继承ApiController,这是如何工作的?如果这可以工作,ApiController需要什么

编辑

public bool SaveEvent(string PartNumber, string DateTimeScheduled, string DateTimeEnd, string Notes, string PSI)
    {
        return DiaryEvent.CreateNewEvent(PartNumber, DateTimeScheduled, DateTimeEnd, Notes, PSI);
    }

上述方法不返回ActionResult,而是一个原语类型,但它是通过ajax调用的,可以将bool true或false作为返回Json的方法返回给HomeController

如果您的web url像这样
http://yourdomain/home/GetPartNumbers
它返回Json结果

现在根据您的编辑,您有了名为SaveEvent的方法。这被称为
http://yourdomain/home/SaveEvent.
这也被MVC管道称为。当您返回像true或false这样的结果或任何不是ActionResult类型的字符串时,它将得到转换后的ContentResult并返回到AJAX调用

此处不会调用Web API路由

即使当时WEB API不可用,开发人员也可以使用MVC和REST

若要进一步检查,请将以下代码放入控制器中,您可以看到在不返回actionresult时转换方法的结果类型

protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            string resultType = filterContext.Result.GetType().Name;
            base.OnActionExecuted(filterContext);
        }
如果您不想调用这样的操作,那么您已经显式地为它们设置了NoAction属性或将其设为private

[NonAction]
        public object Test()
        {
            return new { test = "Jinal" };
        }

您如何确定它适用于同一控制器?如何访问它?我不确定我是否理解这个问题-MVC有
ActionResult
JsonResult
/api/home
是否适合您?您正在使用MVC的rest样式。Rest只能返回结果。但是在下一个版本中,我们有一个控制器,它具有MVC和WebAPI的抽象。在这种情况下,你将无法区分两者。是的。除非它不是马克,谢谢!!我知道操作必须返回ActionResult类型,否则该操作将无法工作。因此,基本上一个操作可以返回基本类型,这些类型被转换为ContentResult right!!对甚至可以返回类的对象。在这种情况下,它将调用tostring方法并返回结果。