我正在创建.NET Core API,以从数据库中读取/写入/更新/删除信息。我已经做好了准备,现在我试图合并视图以使外观看起来更好。我使用Visual Studio 2017的脚手架功能来设置一些基本视图。现在,index.cshtml视图起作用了,它显示了数据库每一行的信息以及用于编辑,查看详细信息或删除每一行的选项。这是通过以下三行添加的,将其放入<td>
语句中的foreach
标记中以循环遍历数据库的结果(item
是结果集中每一行从数据库被称为)
<a asp-action="Edit" asp-route-id="@item.id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.id">Delete</a>
到目前为止,唯一对我有用的是详细信息链接,该链接在我的控制器类中使用一个函数,并使我仅查看该特定行。我注意到编辑和详细信息href并没有抓住该行的ID,因此这些链接将我带回到我已经在其中的索引页。通过将鼠标悬停在每个链接上,可以看到每个href设置为-
编辑::localhost:port / api / results
详细信息::localhost:port / api / results / 1 (我相信这是另外两个应该看起来像的东西)
删除::localhost:port / api / results
我已经进行了一些调试/调查,这是我的问题:
如果多个路由做不同的事情,它们可以具有相同的URI吗?例如,详细信息链接是HttpGet,而删除链接是HttpDelete。如果使用不同的HTTP方法,它们是否都可以具有相同的URI?
在Razor正确组合路线之前,是否必须有一个控制器可以对给定的路线进行某些操作?
我错过的所有内容可能是未将ID添加到超链接的原因吗?所有3条编辑/详细信息/删除路线的设置都完全相同,但是ID仅会添加到路线中以获取详细信息,而不是编辑或删除。
答案 0 :(得分:3)
1)是的,这是正常情况。您可以具有 / results / 1 , PUT结果/ 1 ,删除结果/ 1 , POST结果/ 1
2,3)
按照设计,由于GET基本上用于检索数据,因此链接只能将请求发送到GET方法。但是,POST,PUT,DELETE并不是等幂方法,它们通常会修改服务器上实体的状态。
如果要调用POST和DELETE方法,则应使用<form>
要解决此问题,您必须:
<form>
和多个输入以修改您的输入。 “删除”通常只需要
<form>
具有隐藏的输入(id)。<form>
看看这个example。