MVC 批准或取消批准按钮说明

MVC Approve or Unapprove button Clarification

我是 mvc 的新手,正在尝试弄清楚如何在索引视图上创建批准按钮。需要一些说明。

这里已经有一个关于在 mvc 视图中创建 Approve/Unapprove 按钮的问题。但是在查看它之后,它似乎缺少信息。控制器期望将 SubmitButton 和 ID 传递给它。这个我明白。但是视图的提交按钮只发送没有 ID 的 SubmitButton。有人可以清除迷雾吗?谢谢你。

控制器

[ActionName("Index")]
    [HttpPost]
    public ActionResult IndexPost(string SubmitButton, int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        string buttonClicked = SubmitButton;
        if(buttonClicked == "Approve")
        {
            CurrentApplication currentApplication = db.CurrentApplications.Find(id);
            currentApplication.AppStatus = "APPROVED";
            db.SaveChanges();

        }
        else if(buttonClicked == "Unapprove")
        {
            CurrentApplication currentApplication = db.CurrentApplications.Find(id);
            currentApplication.AppStatus = "UNAPPROVED";
            db.SaveChanges();

        }
        //Save Record and Redirect
        return RedirectToAction("Index");
    }

查看

<button type="submit" name="SubmitButton" value="Approve" class="btn btn-sm btn-success">Approve</button>
<button type="submit" name="SubmitButton" value="Unapprove" class="btn btn-sm btn-danger">Unapprove</button>

控制器将使用状态更改和 return 索引来更新数据库以反映更改。

我想您在 View 中有一个 HTML 表单是用 Html-helpers 制作的。对于您的情况,以下示例代码可能是最简单的代码。

查看 - Home/Index.cshtml

<h2>Welcome to ASP.NET MVC!</h2>

<!-- 
If needed, check BeginForm parameters to send POST
into right controller and action.
-->

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <!-- second parameter is the value for id field. -->
    @Html.Hidden("id", 2001)

    <button type="submit" name="SubmitButton" value="Approve" class="btn btn-sm btn-success">Approve</button>
    <button type="submit" name="SubmitButton" value="Unapprove" class="btn btn-sm btn-danger">Unapprove</button>
}

控制器 - HomeController.cs

using System.Net;
using System.Web.Mvc;

namespace FormTest.Controllers
{
    public class HomeController : Controller
    {
        // GET action for index
        public ActionResult Index()
        {
            // Do something here ...
            return View();
        }

        // POST action for index.
        // Will use same path as GET
        [HttpPost]
        [ActionName("Index")]
        public ActionResult IndexPost(string SubmitButton, int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (SubmitButton == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //Redirect to GET Index
            return RedirectToAction("Index");
        }
    }
}

重要的部分是将生成隐藏输入字段的隐藏助手。如果您需要对用例进行更多修改,read more here about parameters and examples.

@T.Nylund ,你的想法?谢谢。

查看

@model Enumerable<MySQL_MACAddress.Models.macaddress>  
@{ ViewBag.Title = "Index"; }                   
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<table class="table">
<tr>      
<th>
@Html.DisplayNameFor(model => model.Status)
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@HtmlHidden("id", item.idMACAddress)
</td>
<td>
@Html.DisplayFor(modelitem => item.Status)
</td>
<button type="submit" name="SubmitButton" value="Approve" class="btn btn-sm btn-success">Approve</button>
<button type="submit" name="SubmitButton" value="Unapprove" class="btn btn-sm btn-danger">Unapprove</button>

}

我们在批准时针对不同的操作使用不同的控制器方法(按钮批准,按钮拒绝)

我们的观点:

if (!Model.IsApproved)
{
    <td>
        @using (Html.BeginForm("Approve", "BudgetItem", new { id = Model.BudgetItemSid, role = Model.ActiveRole }, FormMethod.Post))
        {<button type="submit" id="btnApprove" style="display: none;">Approve</button>}
    </td>
}
if (!Model.IsRejected)
{
    <td>
        @using (Html.BeginForm("Reject", "BudgetItem", new { id = Model.BudgetItemSid, role = Model.ActiveRole }, FormMethod.Post))
        {<button type="submit" id="btnReject" style="display: none;">Reject</button>}
    </td>
}

我们的控制者:

[HttpPost]
public ActionResult Approve(int id, EnumRole role)
{

}


[HttpPost]
public ActionResult Reject(int id, EnumRole role)
{

}

根据你最新的例子,这是我能想到的最佳答案。起初,您的代码示例有一些语法错误,我需要创建自己的 macaddress -class。我希望它和你的相似。

我使用了与我之前的回答相同的示例。我只修改了视图并创建了 maccaddress -class。控制器与之前相同。

修改后的视图

这是重要的部分。我认为您只是以奇怪的方式格式化了 Html 表单和 tables。这是如何呈现视图的屏幕截图。

现在,当用户点击 批准取消批准 时,表单会将 maccaddress id 和按钮值发送到控制器 IndexPost -action。

在视图示例中:

  • table只是做个例子,需要的话可以修改。
  • 我更改了foreach位置,现在在Html.BeginForm之前。在您的示例中,BeginForm 在 foreach 之外,这在提交代码时造成了一些问题。在某种程度上,您的表单是如何呈现的,不可能知道提交了哪个 ID。
  • @Html.Hidden("id",item.idMACAddress)。它应该在 BeginForm 内。
  • 出于示例目的,我只将 ID 和状态打印到 table。
  • 操作按钮在第三列。

所以它现在起作用的原因是表单的呈现方式。在示例中,现在每个 maccaddress 行都有一个 html 形式。单击按钮时,我们确切地知道要将什么值发送到控制器中。

@model IEnumerable<MySQL_MACAddress.Models.macaddress>
@{ ViewBag.Title = "Index"; }

<table class="table">
    <tr>
        <th> MAC Address </th>
        <th> Status </th>
        <th> Actions </th>
    </tr>

    @foreach (var item in Model)
    {
        using (Html.BeginForm())
        {
            @Html.AntiForgeryToken()

            @Html.Hidden("id", item.idMACAddress)
            <tr>
                <td> @item.idMACAddress </td>
                <td> @item.Status </td>
                <td>
                    <button type="submit" name="SubmitButton" value="Approve" class="btn btn-sm btn-success">Approve</button>
                    <button type="submit" name="SubmitButton" value="Unapprove" class="btn btn-sm btn-danger">Unapprove</button>
                </td>
            </tr>
         }
    }
</table>

maccaddress.cs 例子

检查这个例子。不要只是复制它,因为它可能不适用于您的代码。视图是这里比较重要的部分所以看它。

using System;
namespace MySQL_MACAddress.Models
{
    public class macaddress
    {
        public macaddress()
        {
        }

        public string Status { get; set; }
        public int idMACAddress { get; set; }
    }
}

控制器

查看之前的答案。