C# “只有一次事后行动”;找到多个与请求匹配的操作;错误
我有一个从通用基本控制器继承的控制器,两者都有一个POST操作,其中基本控制器的操作是通用的。域实体被设置为泛型基本控制器的类型参数,一些操作可以为泛型基本控制器的泛型方法传递视图模型类型参数(如POST和PUT) 此通用基本控制器继承自常规基本控制器,自定义的C# “只有一次事后行动”;找到多个与请求匹配的操作;错误,c#,asp.net-mvc,http,generics,asp.net-web-api,C#,Asp.net Mvc,Http,Generics,Asp.net Web Api,我有一个从通用基本控制器继承的控制器,两者都有一个POST操作,其中基本控制器的操作是通用的。域实体被设置为泛型基本控制器的类型参数,一些操作可以为泛型基本控制器的泛型方法传递视图模型类型参数(如POST和PUT) 此通用基本控制器继承自常规基本控制器,自定义的ActionFilterAttribute在其上执行一个方法,以设置实体框架的DbContext实例。我不知道后者是否相关,当我删除这个时,问题仍然存在 我定义了一个路由Web API: config.Routes.MapHttpRout
ActionFilterAttribute
在其上执行一个方法,以设置实体框架的DbContext
实例。我不知道后者是否相关,当我删除这个时,问题仍然存在
我定义了一个路由Web API:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
现在,当我尝试对从泛型基本控制器继承的每个控制器调用POST操作时,我得到了标题中提到的错误。问题是,对于其他HTTP方法,不会发生错误(例如PUT),例如,当我将通用基本控制器上的POST操作的名称更改为“Add”时,错误仍然存在
这是我调用的控制器(只是相关部分):
不知何故,这被视为一个HttpPost
,与我前面提到的tables控制器上的POST操作相冲突。我仍然无法理解这个方法(使用字符串作为param)如何被视为与我的tables控制器上的方法相似。
解决方案是将其标记为内部(这样它就不会通过API暴露)
希望这对其他人有所帮助。不久前我遇到了这个错误:尝试更改一个方法的名称(我知道您尝试过),但同时在它们上面添加[HttpPost,ActionName(“Post”)。@erem我似乎无法在通用控制器上设置该属性。非常感谢!!!你真的救了我一天。我面临着完全相同的问题,这不是明显的行为
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 = "")