2012-02-23 2 views
3

J'ai deux vues partielles "MyPopular" et "MyBlogs". Et il y a deux contrôleurs - "ArticleController.cs" et "ThePopularController.cs". Ces deux vues partielles contiennent des boutons.ASP.NET MVC3 RAZOR: Rediriger à partir de vues partielles

Initialement, il affiche les deux vues partielles dans la vue d'index.

Sur le gestionnaire d'action post pour le clic du blog, il est demandé de rediriger vers l'action "BlogHome" où il retournera une simple chaîne "Blog Home" (au lieu d'une vue). Sur le gestionnaire d'action de publication pour le clic populaire, il est demandé de rediriger vers l'action "PopularHome" où il retournera une chaîne simple "Accueil populaire". Mais actuellement, lorsque je clique sur l'un des boutons, il affiche localhost: 1988/Article index; sans contenu partiel.

Remarque: Le résultat est identique même lorsque j'ai utilisé ContentResult et ActionResult. Note: S'il vous plaît mettez en évidence si je vais dans le mauvais sens pour accomplir une tâche aussi simple.

Comment pouvons-nous le corriger pour effectuer la redirection appropriée?

// ArticleController

public class ArticleController : Controller 
{ 

    public ActionResult Index() 
    { 
     //Index returns no model 
     return View(); 
    } 

    public string BlogHome() 
    { 
     return "Blog Home"; 
    } 


    //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. 
    [ChildActionOnly] 
    public ActionResult MyBlogs() 
    { 
     Thread.Sleep(500); 
     return PartialView(GetAllBlogEntries()); 
    } 

    [ChildActionOnly] 
    [HttpPost] 
    public void MyBlogs(string blogclick) 
    { 
     RedirectToAction("BlogHome"); 
    } 


    private IEnumerable<Blog> GetAllBlogEntries() 
    { 
     return new[] 
        { 
         new Blog { ID = 1, Head = "Introduction to MVC", PostBy = "Lijo", Content = "This is a ..." }, 
         new Blog { ID = 2, Head = "jQuery Hidden Gems", PostBy = "Lijo", Content = "This is a ..." }, 
         new Blog { ID = 3, Head = "Webforms Intenals", PostBy = "Lijo", Content = "This is a ..." } 
        }; 
    } 



} 

// ThePopularController

public class ThePopularController : Controller 
{ 

    public string PoularHome() 
    { 
     return "Poular Home"; 
    } 


    //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. 
    [ChildActionOnly] 
    public ActionResult MyPopular() 
    { 
     Thread.Sleep(500); 
     return PartialView(GetPopularBlogs()); 
    } 


    [ChildActionOnly] 
    [HttpPost] 
    public void MyPopular(string popularpress) 
    { 
     RedirectToAction("PoularHome"); 
    } 


    private IEnumerable<PopularTutorial> GetPopularBlogs() 
    { 
     return new[] 
        { 
         new PopularTutorial { ID = 17, Title = "Test1", NumberOfReads = 1050 }, 
         new PopularTutorial { ID = 18, Title = "Test2", NumberOfReads = 5550 }, 
         new PopularTutorial { ID = 19, Title = "Test3", NumberOfReads = 3338 }, 
         new PopularTutorial { ID = 20, Title = "Test4", NumberOfReads = 3338 }, 
         new PopularTutorial { ID = 21, Title = "Test5", NumberOfReads = 3338 }, 
         new PopularTutorial { ID = 22, Title = "Test6", NumberOfReads = 3338 }, 
         new PopularTutorial { ID = 23, Title = "Test7", NumberOfReads = 3338 }, 
        }; 
    } 
} 

//Index.cshtml

All Blogs List 
@Html.Action("myblogs") 

<br /> 
<br /> 

Popular Tutorial 
@Html.Action("mypopular","thepopular") 

//MyPopular.cshtml

@model IEnumerable<MyArticleSummaryTEST.PopularTutorial> 

@{ 
var grid = new WebGrid(Model, canPage: true, canSort: false, rowsPerPage: 3); 
} 

@grid.GetHtml(
      columns: grid.Columns(grid.Column("", format: @<text>@item.Title</text>)) 
     ) 


@using (Html.BeginForm()) 
{ 
<div> 
    <input type="submit" name ="popularpress" id="2"/> 
</div> 
} 

//MyBlogs.cshtml

@model IEnumerable<MyArticleSummaryTEST.Blog> 

<section> 
<ul> 
    @Html.DisplayForModel() 
</ul> 
</section> 

@using (Html.BeginForm()) 
{ 
<div> 
<input type="submit" name ="blogclick" id="1"/> 
</div> 
} 

// Blog Modèle Afficher

@model MyArticleSummaryTEST.Blog 

<li> 
<h3>@Html.DisplayFor(x => x.Head)</h3> 
@Html.DisplayFor(x => x.Content) 
</li> 

LECTURE:

  1. asp.net MVC partial view controller action

  2. Using Html.BeginForm to post to the current controller

  3. Loading a partial view in jquery.dialog

  4. How can i generate html in action from partial view?

  5. Returning Redirect or PartialView from the same Action

  6. Redirect to Refer on Partial View Form Post using ASP.NET MVC

  7. Why are Redirect Results not allowed in Child Actions in Asp.net MVC 2

  8. ValidationSummary not appearing with Partial Views

  9. d'une Réorienter Vue partielle du "droit" dans ASP.Net MVC 2 http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-in-asp.net.aspx

  10. Demandes partielles en ASP.NET MVC http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

  11. tutoriel d'amélioration progressive avec asp.net mvc 3 et jquery http://www.matthidinger.com/archive/2011/02/22/Progressive-enhancement-tutorial-with-ASP-NET-MVC-3-and-jQuery.aspx

+1

Vous avez des malentendus fondamentaux. Dans votre index.cshtml, vous voulez utiliser ActionLink, pas Action. Action tentera d'exécuter l'action, dans ce cas une redirection HTTP qui n'est pas appropriée, plutôt que de fournir un lien sur lequel vous pouvez cliquer. Je suis sûr que c'est un lien que vous voulez. Étant donné qu'il n'y a pas besoin de ChildActionOnly - cela empêchera ce que vous voulez - ou les actions POST, puisqu'il s'agira d'une requête GET. Je peux me tromper sur ce que vous essayez de réaliser, mais je pense que vous l'avez rendu plus compliqué qu'il ne devrait l'être. – tvanfosson

Répondre

1

bien, pas sûr que ce soit l'histoire ou non, mais vous avez:

public string PoularHome() 
{ 
    return "Poular Home"; 
} 

qui est simplement une méthode. vous émettez ensuite (à partir de votre méthode MyPopular):

RedirectToAction("PoularHome"); 

Comme PoularHome() ne retournera pas un type de ActionResult (ou dérivation), le pipeline va ignorer cette « demande ». Vous devez sérieusement chercher à retourner le type approprié. Essayez Remanier méthode (action) en tant que telle et de voir si elle aide:

public ContentResult PoularHome() 
{ 
    return Content("Poular Home"); 
} 

aucune garantie - juste une observation 30K pieds.

+0

Ne fonctionnait pas lorsque j'utilisais ContentResult ou même ActionResult (et renvoyais un objet View()). Ma question simple est la suivante: comment redirigeons-nous habituellement vers d'autres vues à partir de vues partielles? – Lijo

4

Il y a nombre d'erreurs dans votre code:

  1. Lorsque vous appelez l'action des enfants MyBlogs de l'action mère Index, ayant @using (Html.BeginForm()) dans les MyBlogs voir, génère la forme que les messages à l'action Index, pas MyBlogs un. Même histoire pour Populars. Donc, pas de surprise que chaque soumission rende le contenu de l'action Index - c'est l'action demandée par votre formulaire. Essayez d'utiliser la surcharge de Html.BeginForm qui accepte les paramètres de route.
  2. [ChildActionOnly] signifie que l'action n'est pas accessible par le monde extérieur, soit demander HttpGet, Post, par url ou tout autre moyen. Il peut être utilisé uniquement avec l'assistant Html.Action. Ainsi, lorsque vous corrigez la première erreur, vous ne serez pas encore en mesure de poster sur cette action. Vous devez supprimer l'attribut ChildActionOnly si cette action doit gérer les demandes de publication.
  3. Si c'est le vrai code que vous avez posté, il ne redirige pas (et ne devrait pas). Vous devez corriger la signature de la méthode et ajouter manquante return déclaration

Ce code

[HttpPost] 
public void MyBlogs(string blogclick) 
{ 
    RedirectToAction("BlogHome"); 
} 

devrait être

[HttpPost] 
public ActionResult MyBlogs(string blogclick) 
{ 
    return RedirectToAction("BlogHome"); 
} 

Cela devrait fonctionner

+0

Merci. J'ai corrigé les trois éléments ci-dessus mentiioed. Maintenant, je reçois "Erreur lors de l'exécution de la requête enfant pour le gestionnaire" System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '". Cette erreur se produit dans le Index.cshtml après être revenu du contrôleur. La modification que j'ai faite est comme Html.BeginForm ("Index", "Article") dans MyBlogs.cshtml et MyPopular.cshtml. Comment pouvons-nous le faire fonctionner? – Lijo

+0

@Lijo que disent les exceptions internes? – archil

+0

Exception interne indique: "Les actions enfants ne sont pas autorisées à effectuer des actions de redirection."}. Mais j'ai enlevé tous les mots "enfant" du code que j'ai écrit. Pourtant, il se plaint de l'action de l'enfant. Comment pouvons-nous le corriger? – Lijo

0

par votre code, il semble que vous redirigez à une action qui n'est pas dans le contrôleur actuel. Si l'action ne se trouve pas dans le contrôleur actuel, vous devez utiliser la surcharge qui spécifie à la fois le contrôleur et l'action. Sinon, il va juste tomber dans la route par défaut et vous envoyer à l'index.

Vous devez également renvoyer une RedirectToAction. C'est toujours un type de ActionResult qui doit être renvoyé.

3

Le problème réside avec @using (Html.BeginForm()).

Lorsque nous ne spécifions aucune action et nom de contrôleur dans BeginForm, il affichera des données dans l'URL de la page. (Dans ce scénario Article/Index).

Vous pouvez spécifier l'action et le contrôleur pour afficher les données,

Comme, dans MyBlogs.cshtml

@using(Html.BeginForm("MyBlogs","Article")){ 
...} 

dans MyPopular.cshtml

@using(Html.BeginForm("MyPopular","ThePopular")){ 
...} 
+0

Je reçois la page d'erreur suivante lorsque vous cliquez sur le bouton. Comment pouvons-nous le corriger? "Une erreur s'est produite lors de la compilation d'une ressource requise pour traiter cette requête Le nom de type ou d'espace de nom" ArticleSummary "n'existe pas dans l'espace de noms 'MyArticleSummaryTEST' (" Vous ne trouvez pas de référence d'assembly? "" Public class _Page_Views_ThePopular_PoularHome_cshtml: System. Web.Mvc.WebViewPage { " – Lijo

+0

Vérifiez simplement si la classe ArticleSummary appartient à l'espace de noms MyArticleSummaryTEST .... – Manas

Questions connexes