在具有实体框架核心的ASP.NET Core中的同一视图中使用不同的CRUD提交按钮

问题描述 投票:0回答:1

我通过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>
entity-framework asp.net-core http-post crud razor-pages
1个回答
0
投票

我的问题是,当“读取”,“更新”和“删除”同时发生时,我无法确定从分别进入与控制器连接的同一[HttpPost]视图中的按钮进行的​​不同触发。

例如,您可以使用自定义的asp-route-{value}作为asp-route-myMethod,并将其设置为READUPDATE作为标志,>

<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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.