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; }
}
}
控制器
查看之前的答案。
我是 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; }
}
}
控制器
查看之前的答案。