2010-08-18 2 views
3

Basé sur le code de mon collègue, il passe des attributs HTML dans sa déclaration de formulaire dans la vue en utilisant BeginForm et le code HTML résultant ressemble:Comment puis-je obtenir la valeur de <form> tag?

<form action="/Reviewer/Complete" ipbID="16743" method="post"> 

Comment puis-je obtenir le ipbID dans mon code de contrôleur? J'ai essayé

HttpContext.Request.QueryString["ipbID"] 

... et ...

Request.Form["ipbID"] 

et je suis même allé dans le débogage et suis passé par toutes les parties de Request.Form je pouvais voir si la valeur était là en quelque sorte. N'est-ce pas une bonne pratique de mettre des valeurs comme celle-ci dans l'étiquette de formulaire? Toute aide est appréciée. Merci.

MISE À JOUR: Je dois vous informer que ce formulaire est appliqué à une cellule. Les cellules sont dans un DataTable. Quand je l'utilise renvoie la première valeur qui était cachée, mais aucune des suivantes.

MISE À JOUR 2: Voir

<% Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<PTA.Models.IPB>>" %> 

<%@ Import Namespace="PTA.Helpers"%> 

<b>Assigned IPBs</b> 

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function() { 
    $('#sharedIPBGrid').dataTable(); 
    }); 
</script> 

<% 
if (Model != null && Model.Count() > 0) 
{ 
%> 
<table id="sharedIPBGrid" class="display"> 
    <thead> 
    <tr> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().IPBName) %> 
     </th> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().Status) %> 
     </th> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().PubDate) %> 
     </th> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().ChangeDate) %> 
     </th> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().Priority) %> 
     </th> 
     <th> 
     <%=Html.LabelFor(m => m.FirstOrDefault().Errors) %> 
     </th> 
     <th> 
     Start 
     </th> 
     <th> 
     Stop 
     </th> 
     <th> 
     Complete 
     </th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
<% 
    foreach(IPB ipb in Model) 
    { 
%> 
     //Ignoring everything except for the Complete button as there's a lot of logic in there. 
     <td> 
<% 
     if (ipb.StatusID == (int)PTA.Helpers.Constants.State.InWorkActive) 
     { 
      using (Html.BeginForm("Complete", "Reviewer", FormMethod.Post, new {ipbID = ipb.ID})) 
      { 
%> 
      <%=Html.Hidden("ipbID", ipb.ID)%> 
      <input type="submit" id="btnComplete" value="Complete" /> 
<% 
      } 
     } 
%> 
     </td> 
<% 
    } 
%> 
    </tr> 
    </tbody> 
</table> 
<% 
} 
else 
{ 
    Response.Write("No IPBs found!"); 
} 
%> 

Répondre

6

Ne faites pas comme votre collègue de travail. Il est faux. Aucun attribut ipbID n'est défini sur la balise form, ce qui signifie que vous générez du code HTML incorrect. Les attributs de formulaire ne sont jamais publiés sur le serveur, vous ne pouvez donc pas les obtenir.

Je vous recommande d'utiliser un champ caché qui est beaucoup plus naturel. Ainsi, au lieu de:

<form action="/Reviewer/Complete" ipbID="16743" method="post"> 

Essayez:

<form action="/Reviewer/Complete" method="post"> 
    <input type="hidden" name="ipbID" value="16743" /> 

Et puis Request["ipbID"] ou un paramètre d'action simple contrôleur nommé ipbID vous donnera la valeur requise.

+0

Voir ma mise à jour. J'ai essayé la fonctionnalité cachée, mais parce que j'emballe le formulaire dans une cellule d'une table et j'ai besoin de l'ipbID de cette rangée particulière, cela ne fonctionne pas. Il retourne le premier ipbID, mais si je sélectionne la cinquième rangée, je n'ai pas été le cinquième ipbID. – XstreamINsanity

+3

'Ne faites pas comme votre collègue. C'est faux », AMEN! –

+0

Ensuite, vous devez écrire votre logique pour qu'elle place le bon ID dans l'entrée cachée (c'est-à-dire celle qui se rapporte à la ligne dans laquelle se trouve le formulaire). – Quentin