Reputation: 2241
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
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
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
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