2014-04-22 3 views
0

Ok j'ai 2 deux questions:MVC Routage et Vue partielle

1 - J'ai une vue qui retourne une liste des images de membres. Si vous cliquez sur l'image dont il a besoin pour afficher les informations de membre dans la même vue, mais maintenant je suis l'erreur suivante:

La demande actuelle d'une action « viewMatchResults » sur le type de contrôleur « HomeController » est ambigu entre les méthodes d'action suivantes: viewMembers System.Web.Mvc.ActionResult (Int32) sur le type ServingTeam.Controllers.HomeController System.Web.Mvc.ActionResult viewMembers() sur le type ServingTeam.Controllers.HomeController

Controller:

public ActionResult ViewMembers() 
{ 
    TempData["returnMember"] = false; 

    List<Members> members = memberRepo.GetAllMembers(); 

    return View(members); 
} 

[ActionName("ViewMembers")] 
public ActionResult ViewMembers(int slug) 
{ 
    Members member = new Members(); 

    member = memberRepo.GetMember(slug); 

    if (member != null) 
     return View(member); 

    return View("ViewMembers"); 
} 

2 - Comment afficher un seul objet dans la vue qui affiche la liste des membres? J'ai créé une vue partielle pour afficher les informations du membre mais cela ne me permet pas de le faire.

Toute aide serait appréciée

+0

utiliser un appel ajax pour renseigner la vue partielle. voir ma réponse ici http://stackoverflow.com/questions/19643864/how-do-i-render-a-partial-form-element-using-ajax/19643974#19643974.en utilisant l'appel ajax vous pouvez changer le nom de la méthode en quelque chose d'unique pour faire disparaître l'autre erreur –

+0

Je ne veux pas utiliser un appel ajax – Gericke

Répondre

1

Vous avez deux actions de contrôleur (méthodes) qui ont la même route. Vous devez renommer l'un d'entre eux. Vous pouvez toujours renvoyer la même vue des deux. Je suggère de renommer le second en ViewMember.

Pour la deuxième partie de la question:

Si vous insistez sur l'utilisation de la même vue à la fois: afficher la liste des membres et d'afficher les informations de membre « sélectionné », puis soit ajouter SelectedMember propriété à votre modèle ou l'ajouter au ViewBag et passez cela dans votre vue partielle. Alors, votre action pourrait ressembler à ceci:

public ActionResult ViewMember(int slug) 
{ 
    List<Members> members = memberRepo.GetAllMembers(); 
    Member member = memberRepo.GetMember(slug); 

    ViewBag["SelectedMember"] = member; 

    return View("ViewMembers", members); 
} 

Assurez-vous de vérifier si ViewBag["SelectedMember"] n'est pas null avant de vous rendre la vue partielle, ou manipuler les null cas dans la vue partielle.

+0

La chose est que je veux retourner l'information du membre dans la même vue que La liste est dans – Gericke

+0

Est-ce que ViewBag ["SelectedMember"] aura réellement des propriétés comme l'objet orignal? Serai-je capable de l'utiliser comme ViewBag ["SelectedMember"]. Nom? – Gericke

+0

Vous allez transmettre la valeur de 'ViewBag [" SelectedMember "]' dans votre vue partielle. À partir de là, dans la vue partielle, vous travaillerez normalement avec le modèle et vous utiliserez 'Model.Name' etc. – Floremin

0

Pourquoi faites-vous deux actions différentes. une action peut faire le travail pour vous:

[ActionName("ViewMembers")] 
public ActionResult ViewMembers(int slug=0) 
{ 
    if(slug > 0) 
    { 
    Members member = null; 

    member = memberRepo.GetMember(slug); 

    if (member != null) 
     return View(member); 

    return View("ViewMembers"); 
    } 
    else 
    { 
    TempData["returnMember"] = false; 

    List<Members> members = memberRepo.GetAllMembers(); 

    return View(members); 
    } 

} 
+0

Pas besoin de '= New Member()' devrait juste être '= null', de cette façon vous ne construisez pas un objet qui n'est jamais utilisé. –

+0

merci pour le commentaire @ErikPhilips je l'édite –

+0

@EhsanSajjad cela ne va pas travailler pour moi, j'ai toujours besoin d'avoir tous les membres. J'ai besoin d'afficher une vue partielle lorsque l'utilisateur veut voir l'information d'un certain membre – Gericke

0

Je vous recommande de ne pas utiliser TempData ou ViewBag, parce que les deux ne sont pas fortement typé-intuitif (pour vous ou quelqu'un d'autre à la recherche du code), difficile à maintenir, etc, etc. Tout d'abord créer votre ViewModel:

public class ViewMemberViewModel 
{ 
    public ViewMemberViewModel() 
    { 
    // I like having my classes in valid states 
    // before the constructor finishes 
    this.Members = new List<Member>(); 
    }  


    public List<Member> Members { get; set; } 
} 

Ensuite, créez une seule action avec un Nullable<int>. Pourquoi nullable? Parce que l'utilisation magic numbers (type #3) ne sont généralement pas la meilleure façon de décrire ne pas avoir une valeur. N'ayant pas de valeur, est déjà créé dans le framework (null). Ceci est très similaire à Ehsan Sajjad's anwswer.

public ActionResult ViewMembers(int? slug) 
{ 
    var model = new ViewMemberViewModel(); 

    if (slug.HasValue) 
    { 
    var member = memberRepo.GetMember(slug); 
    model.Members.Add(member); 
    } 
    else 
    { 
    var members = memberRepo.GetAllMembers(); 
    model.Members.AddRange(members); 
    } 

    return View(members); 
} 

Avec une belle vue:

@model ViewMemberViewModel 

@foreach(var member in Model.Members) 
{ 
    // The Controller already uses logic 
    // to return 1 or more members. 
} 

@* don't forget if there aren't any *@ 
@if (Model.Members.Count == 0) 
{ 
    // No members to display 
} 
+0

J'aime la logique mais dans mon cas ça ne marchera pas. Tous les membres doivent être renvoyés – Gericke

+0

Soit votre question n'est pas très claire, soit vous ne comprenez pas ma conception. Cette conception renvoie tous les membres ou un seul membre. La vue permet également tous les membres ou un seul membre. Je ne vois pas le problème. –