ASP.NET MVC 4 - Redirection après Modal Enregistrer à l'aide de l'Action Enfant


Mise à JOUR - Il y a beaucoup de messages concernant le Enfant les actions ne sont pas autorisées à effectuer une redirection actions sur DONC et ASP.NET des forums. La solution ci-dessous semble être la solution la plus simple que j'ai vu mais pour ce problème. Si vous avez ce problème - j'espère que vous le trouverez utile. Si il y a mieux, je suis tout à fait ouvert aux suggestions.


J'ai été démolis mon cerveau avec cela toute la journée...

J'ai un FranchiseSet modèle et un Franchise modèle - la relation est qu'un FranchiseSet a-de nombreuses Franchises.

Sur le FranchiseSet indice vue il y a une table de Franchise de Jeux où chaque ligne est cliquable. Lorsque je clique sur une ligne, je reviens un point de vue de la Détails méthode de la FranchiseSetController - grâce à AJAX.

Au sein de ce point de vue il y a un également un tableau qui montre toutes les Franchises associées pour la Franchise de jeu. Il s'agit essentiellement d'un Maître/Détail Vue - Voici à quoi ça ressemble:

ASP.NET MVC 4 - Redirection après Modal Enregistrer à l'aide de l'Action Enfant

Il y a un Twitter Bootstrap modale utilisée pour afficher le formulaire Créer pour les franchises. Voici à quoi ça ressemble:

<div class="modal hide fade in" id="myModal" )>
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Modal header</h3>
      </div>
      <div id="create_franchise_modal_body" class="modal-body">
        @Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })       
      </div>
      <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <a href="#" class="btn btn-primary">Save changes</a>
      </div>
    </div>

À l'intérieur du corps de la modale, je suis en utilisant un @Html.Action aide pour appeler le FranchiseController de Créer méthode:

@Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })

Voici le modal qui est généré à partir de:

ASP.NET MVC 4 - Redirection après Modal Enregistrer à l'aide de l'Action Enfant

La méthode Create succès de l'enregistrement de la nouvelle Franchise, cependant, j'ai cette erreur:

Enfant les actions ne sont pas autorisées à effectuer une redirection actions.

J'ai vu BEAUCOUP de messages sur StackOverflow et la ASP.NET les Forums sur ce sujet, et j'ai essayé de mettre en œuvre certaines des solutions - même à l'aide de JavaScript redirections, mais je n'ai toujours pas été en mesure d'obtenir que cela fonctionne.

Je comprends que depuis que je suis déjà à l'intérieur de la FranchiseSet Contrôleur, qu'il est déjà en train de rendre une vue basée sur la FranchiseSet modèle, de sorte que l'Enfant de la vue de la Franchise, le modèle n'est pas défini. Quel est donc le moyen idéal pour traiter les interactions entre le parent et l'enfant?

Cela semble être un problème très commun, sans une solution commune. Ou au moins pas un de ceux que je peux trouver. Je suis relativement nouveau .net mvc, donc c'est peut être juste moi.

Est à l'aide de @Html.Action un mauvais choix de conception dans ce scénario? J'ai essayé d'utiliser @Html.RenderPartial mais qui provoque une erreur de Serveur Interne 500 - même si j'ai Créer la configuration de la méthode de retour d'une vue partielle.

Voici les FranchiseController Créer des actions - à la fois GET et POST - que je suis en utilisant:

//
//GET: /Franchise/Create

public ActionResult Create(int FranchiseSetId)
{
    ViewBag.PossibleFranchiseSets = franchisesetRepository.All;
    var franchise = new Franchise { FranchiseSetId = FranchiseSetId };
    return PartialView(franchise);
} 

//
//POST: /Franchise/Create

[HttpPost]
public ActionResult Create(Franchise franchise)
{
    if (ModelState.IsValid) {
        franchiseRepository.InsertOrUpdate(franchise);
        franchiseRepository.Save();
        return RedirectToAction("Index", "FranchiseSet");
    } else {
        ViewBag.PossibleFranchiseSets = franchisesetRepository.All;
        return View();
    }
}

La return RedirectToAction("Index", "FranchiseSet"); en collaboration avec le @Html.Action à partir de la vue semble être la source du problème.

Tout conseil est très apprécié!


SOLUTION


J'ai utilisé de la modification de code modal que Russell suggéré ci-dessus, cependant je suis passé de la @Html.RenderPartial méthode pour le @Html.RenderAction méthode à l'intérieur d'un bloc de code.

Voici à quoi il ressemble maintenant.

<div class="modal hide fade in" id="myModal" )>
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Modal header</h3>
      </div>
      @using (Html.BeginForm("Create", "Franchise", FormMethod.Post))
      {
         <div id="create_franchise_modal_body" class="modal-body">
           @{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }
         </div>
         <div class="modal-footer">
           <a href="#" class="btn" data-dismiss="modal">Close</a>
           <button type="submit" class="btn btn-primary">Save changes</button>
         </div>
      }
  </div>

J'ai aussi modifié le contrôleur de la méthode de création, comme Russell suggéré ci-dessus.

En utilisant ceci: @{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }

Je suis en train de mettre dans la @{ } balises à cause de ce que j'ai appris ici: Html.RenderPartial me donner étrange surcharge d'erreur?

J'ai été en mesure d'obtenir la FranchiseController rediriger les requêtes vers sa mère - la FranchiseSetController de l'Indice de méthode, pas de problèmes. De Plus il n'a pas besoin de moi pour le retour JSON et essayer de faire une redirection JavaScript - c'est tout de Rasoir afficher le code.

J'espère que c'est de résoudre le problème de comment Rediriger Enfant actions de retour à l' Parent.

OriginalL'auteur PhillipKregg | 2012-06-28