2009-03-16 6 views
2

J'ai besoin de faire quelques calculs sur un ASP.NET MVC View, une action différente de la soumission du formulaire. J'ai essayé différentes méthodes pour passer le modèle actuel à une nouvelle action de contrôleur via un lien Action, mais le modèle ne semble pas être passé.Comment effectuer une action secondaire (c'est-à-dire calculer des champs) dans ASP.NET MVC?

public ActionResult Calculate(MuralProject proj) 
{ 
    ProjectFormRepository db = new ProjectFormRepository(); 
    List<Constant> constants = db.GetConstantsByFormType(FormTypeEnum.Murals); 

    proj.Materials = new MuralMaterials(); 
    proj.Materials.Volunteers = this.GetVolunteerCount(constants, proj); 

    this.InitializeView(); 
    return View("View", proj); 
} 

Qu'est-ce que ma syntaxe Html.ActionLink besoin d'être pour que je appeler cela et avoir le point de vue du scrutin ont les mêmes données de modèle (avec les changements calculés)? Alternativement, y a-t-il une autre manière d'accomplir ceci?

J'ai essayé aussi une méthode Ajax.ActionLink mais je suis tombé sur le même problème

Modifier: méthode « Donnez à vos boutons submit un nom, puis inspecter la valeur soumise dans votre méthode de commande » est montré here ce que je cherchais.

Répondre

6

[Voir vos commentaires; Je publierai cette réponse ici afin que vous puissiez marquer la question résolue, et marquer le wiki de la communauté pour que je ne reçoive pas de rep pour cela - Dylan]

Donnez un nom à vos boutons d'envoi, puis inspectez la valeur soumise dans votre méthode de commande:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %> 
<input type="submit" name="submitButton" value="Send" /> 
<input type="submit" name="submitButton" value="Cancel" /> 
<% Html.EndForm(); %> 

annonce à

public class MyController : Controller { 
    public ActionResult MyAction(string submitButton) { 
     switch(submitButton) { 
      case "Send": 
       // delegate sending to another controller action 
       return(Send()); 
      case "Cancel": 
       // call another action to perform the cancellation 
       return(Cancel()); 
      default: 
       // If they've submitted the form without a submitButton, 
       // just return the view again. 
       return(View()); 
     } 
    } 

    private ActionResult Cancel() { 
     // process the cancellation request here. 
     return(View("Cancelled")); 
    } 

    private ActionResult Send() { 
     // perform the actual send operation here. 
     return(View("SendConfirmed")); 
    } 

} 
+1

cela est déprimant si nous devons faire des choses comme ça, quoi que soit arrivé à l'argument de «séparation des préoccupations»? rhétorique de Microsoft Hoo haa marketing! Je suis déprimé que c'est le meilleur qu'un cadre peut fournir pour un tel scénario commun –

+0

Quelles sont les préoccupations qui, selon vous, ne sont pas clairement séparées? Si les chaînes magiques vous dérangent, il est facile de configurer une classe statique ou un fichier de ressources externe contenant les légendes et les valeurs des boutons, donc vous ne comptez pas sur les comparaisons de chaînes magiques. –

+3

Comment passeriez-vous les données à l'action appropriée? – rsteckly

0

Un lien d'action lie simplement à une action. Il se traduit par une étiquette <a href="action">action</a>. L'action à laquelle il est lié n'a aucune idée de l'état de la page qu'il vient de quitter.

Vous devez probablement effectuer une POST sur une action, mais il n'envoie que des données de formulaire, pas un objet (bien que mvc puisse automatiquement mapper des champs de formulaire à un objet).

+0

Ok, cela peut être utile. Je n'arrive pas à comprendre comment mapper les données de formulaire à un objet si ce n'est pas la soumission de formulaire que je fais. – paulwhit

+0

Comment manipulez-vous les données? – ChadT

+0

J'ai un ensemble de champs qui se combinent avec certains calculs basés sur le serveur pour remplir un autre ensemble de champs. tous les champs sont dans le modèle – paulwhit

Questions connexes