2009-11-25 4 views
1

Je travaille sur un peu de MVC où je dois router dynamiquement un formulaire vers une certaine combinaison d'actions et de paramètres. Jusqu'à présent, j'ai ceci:ASP.NET MVC - Action dynamique et paramètre pour un formulaire

PageViewModel 
{ 
    public string Action {get;set;} 
    public string Parameter {get;set;} 
    /*... other properties for the form */ 
} 

PageController 
{ 
    public ViewResult MyAction(string myParamterName) { 
    return View("CommonView", 
     new PageViewModel{Action="MyAction", Parameter="myParameterName")); 
    } 
    public ViewResult YourAction(string yourParamterName) { 
    return View("CommonView", 
     new PageViewModel{Action="YourAction", Parameter="yourParameterName")); 
    } 
    /* ... and about 15 more of these */ 
} 

CommonView.aspx:

<%-- ... --%> 
<% using (Html.BeginForm(Model.Action,"PageController",FormMethod.Get)) {%> 
    <%=Html.TextBox(Model.Parameter)%> 
    <input id="submit" type="submit" value="Submit" /> 
<%}%> 
<%-- ... --%> 

Cela fonctionne, mais il a beaucoup de cordes flottant autour de lui dire où aller. Ce que je voudrais avoir est une manière sûre de type de définir les paramètres de forme dans la vue, mais je suis un peu perdu sur la façon d'accomplir ceci. Peut-être quelque chose qui ressemble à ceci -

<% using (Html.BeginForm<PageController>(Model.??ExpressionToGetAction??)) {%> 
    <%=Html.TextBox(Model.??ExpressionToGetParameter??)%> 
    <input id="submit" type="submit" value="Submit" /> 
<%}%> 

Ou, est-il un moyen d'obtenir l'action et le paramètre utilisé pour générer ce point de vue, peut-être à partir des données d'itinéraire?

Ou devrait-il y avoir un schéma de routage personnalisé qui peut gérer tout cela de façon automagique? Donc, ce que je veux vraiment, c'est la façon la plus élégante et la plus sûre possible d'y parvenir. Merci!

EDIT

Comme Josh souligne, l'envoi du formulaire de retour à l'action. Ce trims le code un peu:

PageViewModel 
{ 
    public string ParameterName {get;set;} 
    /*... other properties for the form */ 
} 

PageController 
{ 
    public ViewResult MyAction(string myParamterName) { 
    return View("CommonView", 
     new PageViewModel{ParameterName ="myParameterName")); 
    } 
    public ViewResult YourAction(string yourParamterName) { 
    return View("CommonView", 
     new PageViewModel{ParameterName ="yourParameterName")); 
    } 
    /* ... and about 15 more of these */ 
} 

CommonView.aspx:

<%-- ... --%> 
<% using (Html.BeginForm(FormMethod.Get)) {%> 
    <%=Html.TextBox(Model.ParameterName)%> 
    <input id="submit" type="submit" value="Submit" /> 
<%}%> 
<%-- ... --%> 

On ignore encore comment avoir le champ de saisie lier un paramètre par nom de retour à l'action dont la vue a été créée sans explicitement le spécifiant.

Répondre

0

Ou, est-il un moyen d'obtenir l'action et le paramètre utilisé pour générer ce point de vue

Si vous laissez la partie d'action et contrôleur des arguments de BeginForm vide, il sera à poster à l'endroit où c'est venu de. Vous pouvez avoir deux actions avec le même nom, l'une décorée comme HttpGet et l'autre comme HttpPost, tant qu'elles ont des paramètres différents. Habituellement, le get a un ou aucun, et le poste a plusieurs ou un modèle de liaison.

+0

Ah, bon à savoir. Existe-t-il un moyen d'obtenir le nom du paramètre de l'action, ou un autre moyen de lier la zone de texte au paramètre? –

+0

Quel que soit le modèle que vous définissez dans l'action qui retourne la vue sera le modèle, je ne pense pas qu'il soit nécessaire de faire quelque chose de spécial. –

Questions connexes