我通过ASP.NET Core Razor页面结构中的三个不同按钮,通过Entity Framework Core管理从数据库的读取,更新和删除过程。
我正在通过ASP.NET Core控制器将类发送到.cshtml页面;此类包含一个数据库列表和一个数据库列表项。这样,如果一行在数据库列表项下,我可以显示整个数据库列表。
我在此.cshtml中放置的这三个不同按钮中的“删除”按钮没有任何问题,因为我可以通过通过此按钮发送getID从数据库中删除所选数据。同样,当我在此.cshtml中使用“删除”和“读取”或“删除”和“更新”按钮时,我仍然没有问题。
我的问题是,当“读取”,“更新”和“删除”同时发生时,我无法确定从分别进入与控制器连接的同一[HttpPost]视图中的按钮进行的不同触发。
我想做的很简单:
如果按下“读取”按钮,则应根据输入的数据库“ id”值在.cshtml中将属于“ id”值的项目显示在一行中。
如果按下“更新”按钮,则应根据输入的数据库“ id”值在.cshtml中的单行项目中进行更改。
如果按下“删除”按钮,则必须删除输入的数据库“ id”值的数据库项目。
所有这些按钮都在单个.cshtml中,并且都返回单个“ post”值,但是在控制器上按下的按钮我无法理解三个不同的选项。
注意:我剩下的代码完全是更新数据库中的一行并删除数据库中的一行,但是无法实现读取数据库中的一行。使用Read方法时,同样更改数据并路由到UpdateDB。因为,我已经成功删除了DB中仅返回ID值的行;但是读取和更新需要不同的HttpPost结构,所以我认为
示例代码结构:
在ASP.NET Core View.cshtml和HomeController.cs中发送C#类
//Here is my sending class. "SendingClass" will be sent to Index.cshtml via HomeController
public class SendingClass
{
public IEnumerable<ProductDB> GetDB { get; set; }
public int GetID { get; set; }
public ProductDB OneRow { get; set; }
}
//Here is my HomeController
public class HomeController : Controller
{
private IProductRepository repository;
public HomeController(IProductRepository repo)
{
repository = repo;
}
public IActionResult DataDel(int id)
{
repository.DeleteDB(id);
var send = new SendingClass
{
GetDB = repository.MyDB,
GetID = repository.MyDB.First().ID,
OneRow = repository.GetByID(repository.MyDB.First().ID)
};
return RedirectToAction("Index");
}
[HttpGet]
public IActionResult Index()
{
var send = new SendingClass
{
GetDB = repository.MyDB,
GetID = repository.MyDB.First().ID,
OneRow = repository.GetByID(repository.MyDB.First().ID)
};
return View(send);
}
[HttpPost]
public IActionResult Index(SendingClass item)
{
item.OneRow.ID = item.GetID;
if (item.OneRow == null)
{
}
else
{
repository.UpdateDB(item.OneRow);
}
var send = new SendingClass
{
GetDB = repository.MyDB,
GetID = item.GetID,
OneRow = repository.GetByID(item.GetID)
};
return View(send);
}
}
//UpdateDB: My Ef.Core Database Update Method
//DeleteDB: My Ef.Core Database Delete Method
// repository.MyDB: My database which called in Ef.Core
这里是View.cshtml
@model SendingClass
@{
}
<!DOCTYPE html>
<html>
<head>
</head>
<body class="align-items-center">
<form asp-action="Index" asp-controller="Home" method="post">
<label>Data Row Number</label>
<p></p>
<input type="text" asp-for="@Model.GetID" id="@Model.GetID" />
<p></p>
<input type="submit" value="READ" />
<p></p>
<input type="submit" value="UPDATE" />
<p></p>
<input type="submit" asp-action="DataDel" asp-route-id="@Model.GetID" id="@Model.GetID" value="DELETE" />
<p></p>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Customer Number</th>
<th>Price (Old)</th>
<th>Price (New)</th>
<th>Checkout</th>
</tr>
</thead>
<tbody>
<tr>
<td asp-for="@Model.OneRow.ID">@Html.DisplayFor(m => Model.OneRow.ID)</td>
<td asp-for="@Model.OneRow.Name">@Html.TextBoxFor(m => Model.OneRow.Name)</td>
<td asp-for="@Model.OneRow.CustomerNo">@Html.TextBoxFor(m => Model.OneRow.CustomerNo)</td>
<td asp-for="@Model.OneRow.PriceOld">@Html.TextBoxFor(m => Model.OneRow.PriceOld)</td>
<td asp-for="@Model.OneRow.PriceNew">@Html.TextBoxFor(m => Model.OneRow.PriceNew)</td>
<td asp-for="@Model.OneRow.Checkout">@Html.TextBoxFor(m => Model.OneRow.Checkout)</td>
</tr>
</tbody>
</table>
</form>
<p></p>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>NO</th>
<th>Price (Old)</th>
<th>Price (New)</th>
<th>Checkout</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.GetDB)
{
<tr>
<td>@Html.DisplayFor(m => item.ID)</td>
<td>@Html.DisplayFor(m => item.Name)</td>
<td>@Html.DisplayFor(m => item.CustomerNo)</td>
<td>@Html.DisplayFor(m => item.PriceOld)</td>
<td>@Html.DisplayFor(m => item.PriceNew)</td>
<td>@Html.DisplayFor(m => item.Checkout)</td>
</tr>
}
</tbody>
</table>
<p></p>
</body>
</html>
我的问题是,当“读取”,“更新”和“删除”同时发生时,我无法确定从分别进入与控制器连接的同一[HttpPost]视图中的按钮进行的不同触发。
例如,您可以使用自定义的asp-route-{value}
作为asp-route-myMethod
,并将其设置为READ
或UPDATE
作为标志,>
<input type="submit" asp-route-myMethod="READ" value="READ" /> <p></p> <input type="submit" value="UPDATE" /> <p></p> <input type="submit" asp-action="DataDel" asp-route-id="@Model.GetID" id="@Model.GetID" value="DELETE" />
然后在
POST
操作上,您可以从查询字符串中获取myMethod
参数以进行区分
[HttpPost]
public IActionResult Index(SendingClass item, [FromQuery] string myMethod = null)
{
item.OneRow.ID = item.GetID;
if (myMethod == "READ")
{
//For Read
}
else
{
//For Update
repository.UpdateDB(item.OneRow);
}
var send = new SendingClass
{
GetDB = repository.MyDB,
GetID = item.GetID,
OneRow = repository.GetByID(item.GetID)
};
ModelState.Clear();
return View(send);
}