首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表单上来自部分视图的多个提交按钮,只有列表中的第一个按钮提交数据

表单上来自部分视图的多个提交按钮,只有列表中的第一个按钮提交数据
EN

Stack Overflow用户
提问于 2020-09-24 16:34:25
回答 1查看 146关注 0票数 0

我有一个设备列表,我需要为每个设备做两个不同的操作(所以我添加并创建了两个部分视图,每个视图都有提交按钮)。我使用一个for循环来创建我的视图,在这个循环之外,我需要在选择操作的末尾提交。结论我有两个提交按钮,在一个for循环和第三个按钮中创建了X次,这使我可以验证我的表单。

我创建了一个多按钮属性,它非常好地引导我找到好的操作。但是,只有列表的第一个元素是提交数据。一旦我提交了第二个元素,在action方法上收到的视图模型保留了第一个元素的一些信息。

我不知道如何使我的提交按钮在循环中的不同?,知道我的方法有多个按钮是完美的工作。

我的主要观点EquipementVsZone

代码语言:javascript
复制
@model SiteReservationGestionPFL.Areas.Reservation.Data.EquipementsParZoneViewModel


@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Equipements.Count(); i++)
    {
        <div class="form-row">
            <div class="col-sm-8 col-md-8">
                <div class="checkbox">

                    @Html.CheckBoxFor(m => m.Equipements[i].EstSelectionne)
                    <strong>@Html.LabelFor(m => m.Equipements[i].EstSelectionne, Model.Equipements[i].equipement.nom + "( Num GMAO: " + Model.Equipements[i].equipement.numGmao + " )")</strong>
                </div>
                <div class="row">
                    <div class="col-sm-6 col-md-6">
                        Emplacement pour la photo
                    </div>
                    <div class="col-sm-6 col-md-6">
                        Emplacement pour les liens résa!
                    </div>
                </div>
            </div>
            <br />
            <div class="col-sm-4 col-md-4">
                <a class="btn-link" href="#" onclick="showCalendar(@Model.Equipements[i].equipement.id.ToString())">Voir disponibilité @Model.Equipements[i].equipement.id.ToString()</a>
            </div>
            <br />
            <div class="row">
                <div class="col-sm-12 col-md-12">
                    <div id="@Model.Equipements[i].equipement.id.ToString()" class="hide" style="display:none">
                        <div class="form-group row">
                            <hr />
                            <div class="row">
                                <div class="col-sm-10 col-md-10 offset-1">
                                    @Html.Partial("~/Areas/Reservation/Views/Shared/_CalendrierEquipement.cshtml", Model.CalendrierChildVM[i])
                                </div>
                            </div>
                        </div>
                        <hr />
                        <div id="cren-content">
                            @Html.Partial("~/Areas/Reservation/Views/Shared/_Creneau.cshtml", Model.CalendrierChildVM[i])
                        </div>
                        <hr />
                        <div class="form-group row">
                            <div class="col-sm-12 col-md-12">
                                <h6>Récapitulatif équipement: @Model.Equipements[i].equipement.nom</h6>
                                <table class="table table-hover">
                                    <thead>
                                        <tr>
                                            <th scope="col">Date Début</th>
                                            <th scope="col">Date Fin</th>
                                            <th scope="col">Heure Début</th>
                                            <th scope="col">Heure Fin</th>
                                            <th scope="col">Action</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        @for (int j = 0; j < Model.CalendrierChildVM[i].ResaEquipement.Count(); j++)
                                        {
                                            <tr>
                                                <td>@Model.CalendrierChildVM[i].ResaEquipement[j].date_debut.ToShortDateString()</td>
                                                <td>@Model.CalendrierChildVM[i].ResaEquipement[j].date_fin.ToShortDateString()</td>
                                                <td>@Model.CalendrierChildVM[i].ResaEquipement[j].date_debut.ToShortTimeString()</td>
                                                <td>@Model.CalendrierChildVM[i].ResaEquipement[j].date_fin.ToShortTimeString()</td>
                                                <td>Supprimer</td>
                                            </tr>
                                        }
                                    </tbody>
                                </table>
                            </div>
                        </div>
                        <hr />
                    </div>
                </div>
            </div>
        </div>
    }
    <br />
    <div class="form-group row">
        <div class="col-md-2">
            <!--'javascript:history.go(-1)' pour revenir à la page précedente :) pas mal! voir pour le rajouter sur
                le formulaire projet et vérifier si le récapitulatif se met à jour-->
            <a href='javascript:history.go(-1)' class="btn btn-primary" role="button">
                Annuler
            </a>
        </div>
        <div class="offset-9 col-md-1">
            <input type="hidden" name="Index" value="@Model.NomZone" />
            <input type="submit" class="btn btn-default navbar-inra" value="Valider" name="action" />
        </div>
    </div>
}



<link href="~/Content/themes/base/jquery-ui.min.css" rel="stylesheet" />

@section Scripts
{
    <!-- JS includes -->
    <script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>


    <script type="text/javascript">

        $('.datepick').datepicker({
            dateFormat: "dd/mm/yy",
            changeMonth: true,
            changeYear: true,
            yearRange: "2019:2040"
        });

        function showCalendar(parameter) {
            var divid = document.getElementById(parameter);
            if (divid.style.display == "") {
                divid.style.display = "none";
            } else {
                divid.style.display = "";
            }
        }
    </script>
}

部分视图_Creneau.cshtml

代码语言:javascript
复制
@model SiteReservationGestionPFL.Areas.Reservation.Data.CalendrierEquipChildViewModel


<h5>Réservation @Model.equiID</h5>
<div class="form-row">
    <div class="col-sm-8 col-md-8">
        <div class="row">
            <div class="col-sm-4 col-md-4">
                <!--Date picker -->
                <div class="input-group date">
                    @Html.Label("Date Début:  ")
                    @Html.EditorFor(m => m.DateDebut, new { htmlAttributes = new { @class = "datepick form-control col-7", @id = "ResaDebutDP_" + Model.equiID, @placeholder = "MM/DD/YYYY" } })
                    @Html.ValidationMessageFor(m => m.DateDebut, "", new { @class = "text-danger" })
                    <!--<input type="text" class="form-control" id="datepickerdebut" placeholder="MM/DD/YYYY">-->
                </div>
            </div>
            <div class="col-sm-3 col-md-3">
                @Html.RadioButtonFor(m => m.DatePickerDebut_Matin, "true")
                @Html.Label("Matin", new { @class = "col-md-4 control-label" })
                @Html.ValidationMessageFor(m => m.DatePickerDebut_Matin, "", new { @class = "text-danger" })
            </div>
            <div class="col-sm-3 col-md-3">
                @Html.RadioButtonFor(m => m.DatePickerDebut_Matin, "false")
                @Html.Label("Après-midi", new { @class = "col-md-8 control-label" })
                @Html.ValidationMessageFor(m => m.DatePickerDebut_Matin, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="row">
            <div class="col-sm-4 col-md-4">
                <div class="input-group date">
                    @Html.Label("Date Fin:  ")
                    @Html.EditorFor(m => m.DateFin, new { htmlAttributes = new { @class = "datepick form-control col-7", @id = "ResaFinDP_" + Model.equiID, @placeholder = "MM/DD/YYYY" } })
                    @Html.ValidationMessageFor(m => m.DateFin, "", new { @class = "text-danger" })
                    <!-- CHANGER LE m => m.NomZone et rajouter la vrai variable du viewModel<input type="text" class="form-control" id="datepickerdebut" placeholder="MM/DD/YYYY">-->
                </div>
            </div>
            <div class="col-sm-3 col-md-3">
                @Html.RadioButtonFor(m => m.DatePickerFin_Matin, "true")
                @Html.Label("Matin", new { @class = "col-md-4 control-label" })
                @Html.ValidationMessageFor(m => m.DatePickerFin_Matin, "", new { @class = "text-danger" })
            </div>
            <div class="col-sm-3 col-md-3">
                @Html.RadioButtonFor(m => m.DatePickerFin_Matin, "false")
                @Html.Label("Après-midi", new { @class = "col-md-8 control-label" })
                @Html.ValidationMessageFor(m => m.DatePickerFin_Matin, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
    <!-- pour passer l'id equipement et l'id zone à la méthode AddReservation() -->
    @Html.HiddenFor(model => model.equiID)
    <div class="col-sm-4 col-md-4">
        <input type="submit" class="btn btn-outline-success" value="Ajouter Réservation" name="action" />
    </div>
</div>

部分视图_CalendrierEquipement

代码语言:javascript
复制
@model SiteReservationGestionPFL.Areas.Reservation.Data.CalendrierEquipChildViewModel

<div class="form-group">
    <h6> Sélectionnez les dates pour voir les créneaux disponibles pour l'équipement @Model.equiID</h6>
    <div class="form-group row">
        <br />
        @*@using(Html.BeginForm("GetPlanning", "Reservation", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
        {
            @Html.AntiForgeryToken()*@
            <div class="form-group row justify-content-center">
                <div class="col-sm-4 col-md-4 col-lg-4">
                <!--Date picker -->
                    <div class="input-group date">
                        @Html.Label("Du : ")
                        @Html.EditorFor(m => m.DatePickerDu, new { htmlAttributes = new { @class = "datepick form-control col-10", @id = "datPickDu_" + Model.equiID.ToString(), @placeholder = "MM/DD/YYYY" } })
                        @Html.ValidationMessageFor(m => m.DatePickerDu, "", new { @class = "text-danger" })
                        <!--<input type="text" class="form-control" id="datepickerdebut" placeholder="MM/DD/YYYY">-->
                    </div>
                </div>
                <div class="col-sm-4 col-md-4 col-lg-4">
                    <!--Date picker -->
                    <div class="input-group date">
                        @Html.Label("Au : ")
                        @Html.EditorFor(m => m.DatePickerAu, new { htmlAttributes = new { @class = "datepick form-control col-10", @id = "datPickAu_" + Model.equiID.ToString(), @placeholder = "MM/DD/YYYY" } })
                        @Html.ValidationMessageFor(m => m.DatePickerAu, "", new { @class = "text-danger" })
                        <!-- pour passer l'id zone de cette vue au controleur Reservation methode GetPlanning() -->
                        @Html.HiddenFor(model => model.zoneID) 
                        <!--<input type="text" class="form-control" id="datepickerdebut" placeholder="MM/DD/YYYY">-->
                    </div>
                </div>
                <div class="col-sm-4 col-md-4 col-lg-4">
                    <input type="submit" class="btn btn-outline-success" value="Afficher Planning" name="action" />
                </div>

            </div>
            
        @*}*@
        </div>
    <br />
    <div class="row">
        <table class="table table-bordered">
            <h5 class="text-center">Titre Calendrier Semaine ou (du x au x) </h5>
            <thead class="thead-dark">
                <tr>
                    <th scope="col">Créneaux</th> <!--Colonne pour ajouter les créneau matin et aprèm, pas besoin de head-->
                    @foreach (var x in Model.ListResasSemaine)
                    {
                        <th scope="col">@x.NomJour @x.JourResa.ToShortDateString()</th>
                    }
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th scope="row">
                        <dl class="dl-horizontal text-center">
                            <br />
                            <dd>M</dd>
                            <dd>A</dd>
                            <dd>T</dd>
                            <dd>I</dd>
                            <dd>N</dd>
                        </dl>
                    </th>
                    @foreach (var y in Model.ListResasSemaine)
                    {
                        <td>
                            @foreach (var i in y.InfosResaMatin)
                            {
                                @i.essai.projet.titre_projet
                            }
                        </td>
                    }
                </tr>
                <tr>
                    <th scope="row">
                        <dl class="dl-horizontal text-center">
                            <br />
                            <dd>A</dd>
                            <dd>P</dd>
                            <dd>R</dd>
                            <dd>E</dd>
                            <dd>M</dd>
                        </dl>
                    </th>
                    @foreach (var y in Model.ListResasSemaine)
                    {
                        <td>
                            @foreach (var i in y.InfosResaAprem)
                            {
                                @i.essai.projet.titre_projet
                            }
                        </td>
                    }
                </tr>
            </tbody>
        </table>
    </div>
</div>

主计长方法:

代码语言:javascript
复制
        [HttpPost]
        [AllowMultipleButton(Name = "action", Argument = "Afficher Planning")]
        public ActionResult AfficherPlanning(CalendrierEquipChildViewModel model)
        {
            ViewBag.Message = "AfficherPlanning";

            return View();
        }

        [HttpPost]
        [AllowMultipleButton(Name = "action", Argument = "Ajouter Réservation")]
        public ActionResult AjouterResa(CalendrierEquipChildViewModel model)
        {
            // Récupérer la session "EquipementZone"
            EquipementsParZoneViewModel equipementZone = (EquipementsParZoneViewModel)this.HttpContext.Session["EquipementZone"];

            
            return View("EquipementVsZone", equipementZone);
        }

        [HttpPost]
        [AllowMultipleButton(Name = "action", Argument = "Valider")]
        public ActionResult Valider(EquipementsParZoneViewModel model)
        {
            // Récupérer la session "EquipementZone"
            EquipementsParZoneViewModel equipementZone = (EquipementsParZoneViewModel)this.HttpContext.Session["EquipementZone"];
            ViewBag.Message = "Valider les réservations";

            return View();
        }

我的多个按钮属性AllowMultipleButtonAttribute

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;

namespace SiteReservationGestionPFL.Areas.Reservation
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class AllowMultipleButtonAttribute: ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }

        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            var isValidName = false;
            isValidName = controllerContext.HttpContext.Request[Name] != null &&
                controllerContext.HttpContext.Request[Name] == Argument;

            return isValidName;
        }
    }
}

如果你有主意的话,你能帮帮我吗?提前谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2020-09-24 17:11:17

也许您需要修改属性def和Razor代码。

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

然后在提交按钮中设置

代码语言:javascript
复制
<form action="" method="post">
 <input type="submit" value="Save" name="action:Save" />
 <input type="submit" value="Cancel" name="action:Cancel" />
</form>

和控制人员

代码语言:javascript
复制
[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(MessageModel mm) { ... }

[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(MessageModel mm) { ... }

我希望这对你有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64050675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档