2017-09-15 1 views
0

Je travaille sur une application de feuille de temps où les employés créent une feuille de temps en fonction du nombre de projets auxquels ils ont été assignés par un administrateur. This is a view of a user with 4 project to create a timesheet for. Each row here is a form created by a loop based on the number of projects passed to a viewbag.Comment puis-je soumettre un nombre inconnu de formulaires dans ASP.NET MVC

C'est le code de mon point de vue qui crée les formes

<tbody style="font-size: 13px;"> 
         @{ 
          int i = 0; 

          } 
         @while (i < ViewBag.projCount) 
         { 
          using (Ajax.BeginForm("BillableHours", "TimesheetManager", 
           new AjaxOptions 
           { 
            OnSuccess = "OnSuccess", 
            OnFailure = "OnFailure", 
            LoadingElementId= "progress" 
           }, new { id= "Form-" + i})) 
          { 
          <tr> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Monday, new { @class = "form-control", type = "number", min = "0", id = "B_Monday-" + i.ToString(), max = "8", onChange = "totalMonday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Tuesday, new { @class = "form-control", type = "number", min = "0", id = "B_Tuesday-" + i.ToString(), max = "8", onChange = "totalTuesday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Wednesday, new { @class = "form-control", type = "number", min = "0", id = "B_Wednesday-" + i.ToString(), max = "8", onChange = "totalWednesday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Thursday, new { @class = "form-control", type = "number", min = "0", id = "B_Thursday-" + i.ToString(), max = "8", onChange = "totalThursday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Friday, new { @class = "form-control", type = "number", min = "0", id = "B_Friday-" + i.ToString(), max = "8", onChange = "totalFriday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Saturday, new { @class = "form-control", type = "number", min = "0", id = "B_Saturday-" + i.ToString(), max = "8", onChange = "totalSaturday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- Hours code begins --> 
            <div> 
             @Html.TextBoxFor(p => p.B_Sunday, new { @class = "form-control", type = "number", min = "0", id = "B_Sunday-" + i.ToString(), max = "8", onChange = "totalSunday(); checkTotal();" }) 
            </div> 
            <!-- hours code ends --> 
           </td> 
           <td> 
            <!-- project selection --> 
            @Html.DropDownListFor(p => p.ProjectID, ViewBag.Projects as SelectList, "--select project--", new { @class = "form-control" }) 
            <!-- project selection ends --> 
           </td> 
           <td> 
            <!-- comments --> 
            <div> 
             @Html.TextBoxFor(p => p.ResourceComments, new { @class = "form-control", placeholder = "Comments...", type = "text" }) 
            </div> 

           </td> 
          </tr>        
          } 
          i++; 
         } 

        </tbody> 

S'il vous plaît, je besoin d'aide sur la façon de soumettre le formulaire (s), compte tenu du nombre de lignes est différent pour chaque utilisateur

C'est le ViewModel

public class BillableHoursViewModel 
{ 

    //billable hours 

    public int ProjectID { get; set; }   
    public double B_Monday { get; set; } 
    public double B_Tuesday { get; set; } 
    public double B_Wednesday { get; set; } 
    public double B_Thursday { get; set; } 
    public double B_Friday { get; set; } 
    public double B_Saturday { get; set; } 
    public double B_Sunday { get; set; } 
    public string ResourceComments { get; set; } 
} 
+0

Ne serait-il pas plus facile de créer un seul formulaire, de passer toutes les lignes de ce formulaire et de les trier du côté du contrôleur? – Wndrr

+0

Dans votre exemple actuel, tous les champs de chaque ligne n'auront-ils pas la même valeur? À quoi ressemble votre ViewModel? – Wndrr

+0

J'ai ajouté le ViewModel –

Répondre

0

Pour envoyer plusieurs formes comme celui-ci, vous pouvez ajouter un bouton caché dans chaque forme et le programme « clic » sur t Il bouton quand vous voulez que tous ces formulaires soient envoyés.

Le clic peut être fait programmatique en utilisant $('.submitRow').click(), étant donné que vous avez ajouté une ligne dans chaque forme qui contient une entrée de type submit avec la classe submitRow. Voici un exemple:

<tr> 
    <td> 
     <input type="submit" name="[email protected]" id="[email protected]" class="submitRow" style="display: none;" /> 
    </td> 
</tr> 

Cela envoie efficacement toutes vos formes, mais il se sent comme vous avez un problème parce que tous ces formulaires utilisent un seul objet ViewModel, ils auront tous les mêmes valeurs lorsque vous chargez la page et un seul d'entre eux sera sauvegardé (ou vous obtiendrez une erreur lors de l'enregistrement). De toute façon, cela ne semble pas être ce que vous essayez d'atteindre.

Vous devrez peut-être repenser la façon dont vous envoyez les données à la vue. Votre ViewModel actuel fonctionne bien pour envoyer les données d'un formulaire à la vue, mais vous aurez besoin d'une liste pour afficher les lignes envoyées par le contrôleur.

+0

Ils n'auront pas les mêmes valeurs étant donné que chaque ligne a un identifiant de projet différent. Mais vrai, votre solution ne produira pas une erreur –

0

Vous pouvez utiliser le script jQuery:

$(".buton_to_submit_all_forms").one(function(){ 
    $(form).submit(); 
}); 

Bouton pour cet ensemble d'action où vous voulez dans la page:

<button type="button" class="buton_to_submit_all_forms">Submit all</button> 

En rasoir par `s par défaut très difficile à faire.

+0

Pourquoi utiliser "un" ici? S'il utilise Ajax cela signifie que le bouton peut être cliqué plusieurs fois ... – Wndrr

+0

Aussi, ne soumettra pas le formulaire envoie réellement une requête HTTP POST classique pour le premier formulaire trouvé et ignore les autres formes puisque la page a été "redirigée" "? Je pense que '.submit()' n'utilisera pas les appels Ajax. Du moins pas dans les tests que j'ai faits: -/ – Wndrr

+1

plus, dans '$ (form)' la variable 'form' n'est pas déclarée. Je crois que vous vouliez dire '$ ('forme')'? – Wndrr