2010-04-10 6 views
2

Je soupçonnais qu'il y avait de la magie cachée quelque part qui arrêtait ce qui ressemble à des appels de méthode réels partout dans T4MVC. Puis j'ai eu une vue échouer à compiler, et le stackTrace est entré dans ma méthode actuelle.T4MVC ne générant pas d'action

 [Authorize] 
    public string Apply(string shortName) 
    { 
     if (shortName.IsNullOrEmpty()) 
      return "Failed alliance name was not transmitted"; 
     if (Request.IsAuthenticated == false || User == null || User.Identity == null) 
      return "Apply authentication failed"; 
     Models.Persistence.AlliancePersistance.Apply(User.Identity.Name, shortName); 
     return "Applied"; 
    } 

Cette méthode n'est donc pas générée dans le modèle après tout.

<%=Ajax.ActionLink("Apply", "Apply", new RouteValueDictionary() { { "shortName", item.Shortname } }, new AjaxOptions() { UpdateTargetId = "masterstatus" })%> 

      <%=Html.ActionLink("Apply",MVC.Alliance.Apply(item.Shortname),new AjaxOptions() { UpdateTargetId = "masterstatus" }) %> 

La deuxième méthode a jeté une exception sur la compilation parce que la méthode Apply dans mon contrôleur a un attribut [Authorize] de sorte que si quelqu'un qui ne soit pas connecté sur les clics, ils sont redirigés pour se connecter, puis de retour à ce page. Là, ils peuvent cliquer sur appliquer à nouveau, cette fois étant connecté.

Et oui, je réalise un est Ajax.ActionLink tandis que l'autre est Html.ActionLink Je les ai essayé tous les deux avec la version T4MVC.

Répondre

2

Mise à jour: Je vois le problème. T4MVC ne prend en charge que les actions qui retournent ActionResult. Il ne traite donc pas cette action particulière qui renvoie une chaîne. Vous pouvez corriger cela en changeant comme suit:

[Authorize] 
    public ActionResult Apply(string shortName) { 
     if (shortName.IsNullOrEmpty()) 
      return Content("Failed alliance name was not transmitted"); 
     if (Request.IsAuthenticated == false || User == null || User.Identity == null) 
      return Content("Apply authentication failed"); 
     Models.Persistence.AlliancePersistance.Apply(User.Identity.Name, shortName); 
     return Content("Applied"); 
    } 

Notez comment elle retourne un ActionResult et de Contenu de retour (« ... ») 'appels au lieu de directement les chaînes de retour.


Pourriez-vous donner plus de détails sur l'exception de compilation que vous obtenez? Je suppose que c'est quelque chose que vous voyez dans le navigateur et pas dans VS? Pourriez-vous inclure le texte intégral de l'erreur?

Généralement, les appels T4MVC via le préfixe MVC ne sont jamais supposés appeler la méthode d'action réelle. Au lieu de cela, ils appellent une méthode substituée dans une classe dérivée. Recherchez un fichier généré appelé quelque chose comme AllianceController.generated.cs (sous T4MVC.tt). Vous devriez voir une méthode 'Apply' surchargée, qui fait juste ce dont T4MVC a besoin.

+0

Je reçois les avertissements suivants lorsque j'exécute un outil personnalisé sur le modèle: Avertissement \t Transformation de compilation: En supposant que la référence d'assemblage 'EnvDTE, Version = 7.0.3300.0, Culture = neutre, PublicKeyToken = b03f5f7f11d50a3a' correspond à 'EnvDTE, Version = 8.0. 0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a ', 'vous devrez peut-être fournir une politique d'exécution. Warning' \t Transformation de compilation: 'Code inaccessible détecté \t T4MVC.tt ligne 788'. et la méthode apply n'est pas générée. Mise à jour de la question avec les autres informations de code/d'exception. – Maslow

+1

C'est juste un avertissement bénin qui n'est pas lié à votre problème. –

Questions connexes