MVC批准或取消批准按钮

时间:2019-01-08 21:52:50

标签: asp.net-mvc-5

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

这里已经有一个关于在mvc视图中创建批准/取消批准按钮的问题。但是,在对其进行审核之后,似乎缺少信息。控制器期望将SubmitButton和ID传递给它。这我明白。但是视图的“提交”按钮仅发送SubmitButton,但没有ID。有人可以消除雾气吗?谢谢。

控制器

[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>

控制器将使用状态更改来更新数据库,并返回索引以反映更改。

4 个答案:

答案 0 :(得分:0)

我想您在使用HTML帮助程序制作的View中有一个HTML表单。就您而言,以下示例代码可能是最简单的示例。

视图-主页/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>
}

Controller-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

答案 1 :(得分:0)

@ 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>

}

答案 2 :(得分:0)

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

我们的观点:

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)
{

}

答案 3 :(得分:0)

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

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

修改后的视图

这是重要的部分。我认为您只是以怪异的方式格式化了HTML表单和表格。这是视图渲染的屏幕截图。

Rendered view example

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

在一个视图示例中:

  • 仅以表格为例,如果需要,可以对其进行修改。
  • 我更改了 foreach 的位置,现在它在 Html.BeginForm 之前。在您的示例中,BeginForm在 foreach 之外,并且在提交代码时引起了一些问题。以某种方式呈现表单的方式,不可能知道提交了哪个ID。
  • 查看 @ Html.Hidden(“ id”,item.idMACAddress)。它应该在 BeginForm 中。
  • 出于示例目的,我仅将ID和状态打印到表中。
  • 操作按钮在第三列中。

所以现在为什么起作用的是呈现表单的方式。在示例中,现在每个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; }
    }
}

控制器

检查先前的答案。