2012-03-12 1 views
0

question fondamentale très simple je ne voie:asp.net routage mvc "vue n'a pas été trouvé"

routes.MapRoute(
       "Widget", // Route name 
       "Widget/Frame/{postUrl}", // URL with parameters 
       new { controller = "Widget", action = "Index", postUrl = UrlParameter.Optional } // Parameter defaults 
      ); 

Et quand je tente d'ouvrir l'URL suivante: "http: // localhost: 50250/Widget/Cadre/qwerty »

J'ai une erreur:

The view 'qwerty' or its master was not found or no view engine supports the searched locations. The following locations were searched:

Eh bien ... pourquoi?

Code Controller:

public class WidgetController : Controller 
    { 
     // 
     // GET: /Widget/ 

     public ActionResult Index(string postUrl, int? blogEngineType) 
     { 
      return View(postUrl); 
     } 




    } 
+0

Montrez-nous l'action du Widget du contrôleur Code du cadre. –

+0

mais je n'ai pas d'index d'action de cadre. de toute façon, voir la mise à jour. – Neir0

+0

Voir ceci: - http://stackoverflow.com/questions/6118840/mvc3-and-rewrites/8255132#8255132 –

Répondre

2

Je hasarder une hypothèse et que c'est parce qu'il est en train d'essayer d'utiliser le nom d'action Index(), puisque c'est l'action par défaut que vous avez spécifié. Vous ne passez pas un paramètre {action} à travers l'URL, alors d'où va-t-il avoir cette action?

Pouvez-vous changer votre modèle d'URL à Widget/{action}/{postUrl} et voir si cela fonctionne alors?

Soit cela, soit de définir la valeur par défaut de action à Frame à la place. Fondamentalement, il n'a aucun moyen de savoir que vous cherchez l'action Frame, donc il échoue. Editer: Je vois ce que vous faites maintenant - le nom de l'action est réellement Index, n'est-ce pas? Dans ce cas, je ne suis pas sûr, nous devons voir le code de votre contrôleur. Je vais laisser la réponse ci-dessus au cas où c'est utile.

Édition 2: Vous passez la valeur "qwerty" comme nom de la vue - avez-vous une vue nommée "qwerty" dans le dossier des vues?

Si vous souhaitez que ce soit le modèle et que le nom de la vue soit "Index", vous devez appeler le return View((object)postUrl); à la place, afin qu'il ne soit pas confondu.

+0

Widget/{action}/{postUrl} cela ne fonctionne pas trop avec url: "http: // localhost: 50250/Widget/index/qwerty " – Neir0

+1

Voir ma modification. L'itinéraire n'est pas votre problème, c'est le nom de la vue. –

2

vous retournez une vue avec

return View(postUrl); 

Comme il n'y a pas de nom de la vue (dans cette surcharge), la méthode utilise le nom d'action comme nom de la vue et cherche. Vous avez probablement voulu faire

return Redirect(postURL); 
+0

Oh oui! Merci!Je veux dire en fait renvoyer View ((object) postUrl); – Neir0

1

Etes-vous sûr qu'il existe une vue appelée 'qwerty' dans le dossier Partagé ou Widget dans le dossier parent Views? Sinon, vous voudrez probablement utiliser return RedirectToAction(postURL);

2

C'est parce que votre déclaration de retour est return View(postUrl); et quand vous passez une chaîne à la méthode View() il est interprété comme le nom de la vue à utiliser. Donc, il cherche une vue appelée qwerty puisque c'est ce qui est dans cette variable. Si vous voulez rendre postUrl en tant que modèle à l'affichage de votre action Index, vous devez changer votre retour pour être return View("Index", postUrl)

+1

Ou comme Steve dit, utilisez 'View ((object) postUrl)', donc il est forcé de le traiter comme un 'object'. –