Gericke
Gericke

Reputation: 2241

MVC Routing and Partial View

Ok I have 2 two questions:

1 - I have a view that returns a list of member's images. If you click on image it needs to display member info in the same view but now I get following error:

The current request for action 'ViewMembers' on controller type 'HomeController' is ambiguous between the following action methods: System.Web.Mvc.ActionResult ViewMembers(Int32) on type ServingTeam.Controllers.HomeController System.Web.Mvc.ActionResult ViewMembers() on 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 - How do I display single object within the view that display the list of members? I have created a partial view to display the member's info but it does not allow me to do so.

Any help would be appreciated

Upvotes: 0

Views: 313

Answers (3)

Ehsan Sajjad
Ehsan Sajjad

Reputation: 62488

Why are you making two different actions. one action can do the job for you:

[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);
    }

}

Upvotes: 0

Erik Philips
Erik Philips

Reputation: 54618

I'd recommend not using TempData or the ViewBag, because both are not-strongly typed, intuitive (for you or anyone else looking at your code), hard to maintain, etc etc. First create your 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; }
}

Next, create a single action with a Nullable<int>. Why nullable? Because using magic numbers (type #3) are typically not the best way to describe not having a value. Not having a value, is already created in the framework (null). This is very similar to 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);
}

With a nice view:

@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
}

Upvotes: 0

Floremin
Floremin

Reputation: 4089

You have two controller actions (methods) that have the same route. You'd need to rename one of them. You can still return the same view from both. I suggest renaming the second one into ViewMember.

For the second part of the question:

If you insist on using the same view for both: displaying list of members and displaying "selected" member info, then either add SelectedMember property to your model or add it to the ViewBag and pass that into your partial view. So, your action could look like this:

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

    ViewBag["SelectedMember"] = member;

    return View("ViewMembers", members);
}

Make sure to check if ViewBag["SelectedMember"] is not null before you render the partial view, or handle the null case in the partial view.

Upvotes: 1

Related Questions