我有一个继承自通用基本控制器的控制器,它们都有一个POST动作,其中基本控制器的动作是通用的。域实体被设置为通用基本控制器的类型参数,并且一些操作可以获得通用基本控制器的通用方法传递的视图模型类型参数(如POST和PUT)。
此通用基本控制器继承自常规基本控制器,自定义ActionFilterAttribute
在其上执行方法以设置Entity Framework
的{{1}}实例。我不知道后者是否相关,当我删除它时问题仍然存在。
我定义了一个路由Web API:
DbContext
现在,当我尝试在从通用基本控制器继承的每个控制器上调用POST操作时,我得到标题中提到的错误。问题是,使用其他HTTP方法不会发生错误(例如PUT),例如,当我将通用基本控制器上的POST操作名称更改为“添加”时,错误仍然存在。
这是我打电话的控制器(只是相关部分):
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
通用基本控制器的操作:
public class TablesController : GenericBaseController<Table>
{
public HttpResponseMessage Post(TablePostModel tableModel)
{
return base.Add(tableModel);
}
public HttpResponseMessage Put(TablePostModel tableModel)
{
return base.Put(tableModel);
}
}
有没有人知道这可能是什么?
修改
显然,基本控制器中的公共方法就是问题。
这是有问题的方法:
protected HttpResponseMessage Post<TViewModel>(TViewModel viewModel)
where TViewModel : BaseModel, new()
{
if (viewModel == null)
throw new ArgumentNullException(
string.Format("The view model {0} cannot be null", typeof(TViewModel)));
if (ModelState.IsValid)
{
TEntity entity = Mapper<TViewModel, TEntity>.Map(viewModel);
try
{
entity = Uow.GetRepository<TEntity>().Add(entity);
Uow.Commit();
}
catch (ValidationException ex)
{
MvcValidationExtension.AddModelErrors(this.ModelState, ex);
return BadRequestResponse();
}
return OkResponse(entity);
}
return BadRequestResponse();
}
protected HttpResponseMessage Put<TViewModel>(TViewModel viewModel)
where TViewModel : BaseModel, new()
{
if (viewModel == null)
throw new ArgumentNullException(
string.Format("The view model {0} cannot be null", typeof(TViewModel)));
if (ModelState.IsValid)
{
TEntity entity = Uow.GetRepository<TEntity>().GetById(viewModel.RowId);
entity = ValueMapper<TViewModel, TEntity>.Map(viewModel, entity);
try
{
entity = Uow.GetRepository<TEntity>().Update(entity);
Uow.Commit();
}
catch (ValidationException ex)
{
MvcValidationExtension.AddModelErrors(this.ModelState, ex);
return BadRequestResponse();
}
return OkResponse(entity);
}
return BadRequestResponse();
}
不知何故,这被视为public void InitializeUnitOfWork(string connectionName = "")
,并与我之前提到的表控制器上的POST操作相冲突。我仍然无法理解这个方法(使用HttpPost
作为参数)可以被视为与我的表控制器上的方法类似。
解决方案是将其标记为string
(因此不会通过API公开)。
希望这有助于某人。