我记得读过&有人告诉你,你应该只对可能改变数据的控制器动作使用[httppost]
(我找不到这些来源 - 而且我无法在Google上找到任何内容)。
如果您是 - 比如说,只是查找数据,您应该使用[httpget]
。
我有2个控制器操作 - 仅用于查找数据,从不用于更改数据。
我尝试在ASP.NET MVC 5控制器中使用两个[httpget]s
:
public ActionResult MyAction(Guid Id)
{
// Id is used to populate the form
}
// I would previously have placed [httppost] here
public ActionResult MyAction(MyObject myobj)
{
// myobj is posted back from the form - but no data is changed in the database, it's just a lookup
}
然而,我收到此错误:
控制器类型的当前动作请求'MyAction' 'MyController'在以下操作方法之间不明确:
编译器遇到模糊方法名称的问题 - 那么这样做的最佳做法是什么?
我们是否必须使用指定明确不同操作的表单? (这看起来不那么优雅和混乱 - 如果是这样的话,它会使[httppost]
看起来更简单,更优雅,更简洁。)
在没有数据被保留的情况下,我们是否应该使用[httpget]
?
THX。
答案 0 :(得分:1)
您的问题是您的控制器中有两个具有相同名称的方法。行动解析器无法决定使用哪一个。
最简单的方法是遵循命名约定,在这种情况下,您不必放置属性:
public ActionResult GetMyAction(Guid Id)
{
// Id is used to populate the form
}
// I would previously have placed [httppost] here
public ActionResult PostMyAction(MyObject myobj)
{
// myobj is posted back from the form - but no data is changed in the database, it's just a lookup
}
但是,如果你想留下你的名字,你必须输入适当的属性:
[HttpGet]
public ActionResult GetMyAction(Guid Id)
{
// Id is used to populate the form
}
// I would previously have placed [httppost] here
[HttpPost]
public ActionResult PostMyAction(MyObject myobj)
{
// myobj is posted back from the form - but no data is changed in the database, it's just a lookup
}
答案 1 :(得分:0)
我认为你误解了get vs post的理由。重要的不是post请求总是改变状态,重要的是get request永远不会改变状态。一个很好的例子是一个内容管理系统,经常会发现他们的内容莫名其妙地消失,然后才发现网络抓取工具正在索引一个管理页面并跟踪他们的删除超链接,所有内容都是使用http get,或预取浏览器随机添加或删除购物车项目。 / p>
那就是说,我可能仍然会让这两个动作使用不同的动作,因为get动词更好地描述了服务动作,但也许你有充分的理由不这样做。