MVC路由和部分视图

时间:2014-04-22 18:59:36

标签: asp.net-mvc

好的我有两个问题:

1 - 我有一个返回成员图像列表的视图。如果单击图像,则需要在同一视图中显示成员信息,但现在出现以下错误:

控制器类型'HomeController'上的当前操作请求'ViewMembers'在以下操作方法之间不明确: System.Web.Mvc.ActionResult类型为ServingTeam.Controllers.HomeController的ViewMembers(Int32) System.Web.Mvc.ActionResult类型为ServingTeam.Controllers.HomeController的ViewMembers()

控制器:

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 - 如何在显示成员列表的视图中显示单个对象?我创建了一个部分视图来显示成员的信息,但它不允许我这样做。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

您有两个具有相同路线的控制器操作(方法)。您需要重命名其中一个。您仍然可以从两者返回相同的视图。我建议将第二个重命名为ViewMember

问题的第二部分:

如果您坚持同时使用相同的视图:显示成员列表并显示&#34;选择&#34;成员信息,然后将SelectedMember属性添加到模型中或将其添加到ViewBag并将其传递到部分视图中。所以,你的行动可能是这样的:

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

    ViewBag["SelectedMember"] = member;

    return View("ViewMembers", members);
}

在渲染局部视图之前,请务必检查ViewBag["SelectedMember"]是否不是null,或在局部视图中处理null案例。

答案 1 :(得分:0)

你为什么要做两个不同的动作。一个动作可以帮到你:

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

}

答案 2 :(得分:0)

我建议不要使用TempDataViewBag,因为两者都不是强类型,直观(对于您或其他任何查看您的代码的人),难以维护等首先创建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; }
}

接下来,使用Nullable<int>创建一个操作。为什么可以为空?因为使用magic numbers (type #3)通常不是描述没有值的最佳方式。没有值,已经在框架中创建(null)。这与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);
}

看得很清楚:

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