Asp.net mvc 4 在控制器web api中为不同实体调用操作方法
我有一个MVC4应用程序。我正在迁移一些逻辑以使用web API。我无法使Asp.net mvc 4 在控制器web api中为不同实体调用操作方法,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我有一个MVC4应用程序。我正在迁移一些逻辑以使用web API。我无法使ChangeState方法在以下代码中工作(未找到404文件)。 我看到那个帖子: 我正在考虑为各州制作一个不同的控制器,因为它是不同的实体,但我很好奇如何让它在这种情况下工作 public class FranchiseController : ApiController { [DataContext] public IEnumerable<FranchiseInfoViewModel> G
ChangeState
方法在以下代码中工作(未找到404文件)。
我看到那个帖子:
我正在考虑为各州制作一个不同的控制器,因为它是不同的实体,但我很好奇如何让它在这种情况下工作
public class FranchiseController : ApiController
{
[DataContext]
public IEnumerable<FranchiseInfoViewModel> GetAllFranchises()
{
var allFranchises = new List<FranchiseInfoViewModel>();
var franchiseInfoList = _franchiseService.GetAll();
foreach (var franchiseInfo in franchiseInfoList)
{
allFranchises.Add(new FranchiseInfoViewModel(franchiseInfo, p => p.IsImportant));
}
return allFranchises;
}
[DataContext]
[System.Web.Http.HttpPost]
public string ChangeState(int franchiseId, FranchiseProductionStates state)
{
_franchiseService.ChangeProductionState(franchiseId, state);
var redirectToUrl = "List";
return redirectToUrl;
}
[DataContext]
public FranchiseInfoViewModel GetFranchise(int? franchiseId)
{
var realId = franchiseId ?? default(int);
var franchiseInfo = _franchiseService.CreateOrGet(realId);
var franchiseInfoViewModel = new FranchiseInfoViewModel(franchiseInfo, p => true);
return franchiseInfoViewModel;
}
}
以及我调用action方法的js代码:
var changeState = function (franchiseId, state) {
var deferred = $.Deferred();
amplify.request({
resourceId: 'changeState',
success: deferred.resolve,
error: deferred.reject,
data: { franchiseId: franchiseId, state: state }
});
return deferred;
};
amplify.request.define('changeState', 'ajax', {
url: "/api/franchise/ChangeState",
type: "POST",
dataType: 'json',
decoder: errorsDecoder
});
注意:特许经营产品状态
为enum类型。欢迎提出任何建议。这是我第一次体验web api。谢谢
我能够做到这一点: 下面是操作方法的外观:
[HttpPut]
public string ChangeState(int id, [FromBody]FranchiseProductionStates state)
{
_franchiseService.ChangeProductionState(id, state);
var redirectToUrl = "List";
return redirectToUrl;
}
注意添加的[FromBody]属性。这实际上是一个PUT动词,而不是POST
这是路线:
config.Routes.MapHttpRoute(
name: "Test",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这就是ajax调用的实现方式:
amplify.request.define('changeState', 'ajax', {
url: "/api/franchise/ChangeState/3",
type: "POST",
//dataType: 'json',
contentType: 'application/json; charset=utf-8',
decoder: errorsDecoder
});
为了简单起见,我已经硬编码了添加到url的id参数
谢谢
amplify.request.define('changeState', 'ajax', {
url: "/api/franchise/ChangeState/3",
type: "POST",
//dataType: 'json',
contentType: 'application/json; charset=utf-8',
decoder: errorsDecoder
});