Кнопка подтверждения или отклонения MVC. - PullRequest
0 голосов
/ 09 января 2019

Я новичок в mvc и пытаюсь выяснить, как создать кнопку подтверждения в индексном представлении. Некоторое уточнение необходимо.

Здесь уже есть вопрос о создании кнопки «Утвердить / Отменить» в представлении mvc. Но после просмотра, кажется, отсутствует информация. Контроллер ожидает, что SubmitButton и идентификатор будут переданы ему. Это я понимаю Но кнопки отправки представления отправляют только 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");
    }

View

<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 голосов
/ 20 января 2019

Согласно вашему новому примеру, вот лучший ответ, который я могу себе представить. Сначала в вашем примере кода есть несколько синтаксических ошибок, и мне нужно было создать собственный macaddress -class . Я надеюсь, что он похож на ваш.

Я использовал тот же пример, что и в моем предыдущем ответе. Я только изменил представление и создал maccaddress -class. Контроллер такой же, как и раньше.

Модифицированный вид

Это важная часть. Я думаю, что вы только что отформатировали HTML-форму и таблицы странным образом. Вот скриншот того, как отображается представление.

Rendered view example

Теперь, когда пользователь нажимает Одобрить или Не утвердить форма отправит идентификатор maccaddress и значение кнопки в контроллер IndexPost -action.

В примере просмотра:

  • таблица сделана только для примера, измените ее при необходимости.
  • Я изменил foreach местоположение, теперь оно до Html.BeginForm . В вашем примере BeginForm находился вне foreach , и это вызвало несколько проблем при отправке вашего кода. В способе отображения вашей формы невозможно было узнать, какой идентификатор отправлен.
  • Look @Html.Hidden ("id", item.idMACAddress) . Должно быть внутри BeginForm .
  • У меня есть только идентификатор и статус печати в таблицу для примера.
  • Кнопки действий находятся в третьем столбце.

Итак, почему это работает сейчас, это способ отображения формы. В этом примере теперь есть одна 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; }
    }
}

Контроллер

Проверьте предыдущий ответ.

0 голосов
/ 17 января 2019

@T.Nylund, ваши мысли? Спасибо.

View

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

}

0 голосов
/ 18 января 2019

Мы используем разные методы контроллера для разных действий при утверждении (кнопка для подтверждения, кнопка для отклонения)

Наше мнение:

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

}
0 голосов
/ 10 января 2019

Полагаю, у вас есть 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>
}

Контроллер - 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");
        }
    }
}

Важной частью является скрытый помощник, который сгенерирует скрытое поле ввода. Если вам нужно больше модификаций в вашем случае использования, читайте больше здесь о параметрах и примерах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...