2014-04-22 101 views
0

好吧我有两个问题:MVC路由和局部视图

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

行动上控制器类型“的HomeController” ViewMembers“目前的要求是采用下列操作方法之间的暧昧: 上型ServingTeam.Controllers.HomeController上型ServingTeam.Controllers.HomeController System.Web.Mvc.ActionResult ViewMembers System.Web.Mvc.ActionResult ViewMembers(的Int32)()

控制器:

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

任何帮助,将不胜感激

+0

使用AJAX调用用于填充局部视图。看到我的答案在这里http://stackoverflow.com/questions/19643864/how-do-i-render-a-partial-form-element-using-ajax/19643974#19643974。使用ajax调用你可以改变方法的名称为独特的东西让其他错误消失 –

+0

我不想使用ajax调用 – Gericke

回答

1

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

对于问题的第二部分:

如果你坚持使用同样的看法两种:显示成员名单,并显示“选择”成员信息,然后要么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情况。

+0

事情是我想在同一视图中返回成员的信息该列表在 – Gericke

+0

Will ViewBag [“SelectedMember”]实际上是否具有类似于orignal对象的属性?我能否像ViewBag [“SelectedMember”]一样使用它。名称? – Gericke

+0

您会将'ViewBag [“SelectedMember”]'的值传递给您的局部视图。从那里在部分视图中,你会正常使用模型,并使用'Model.Name'等。 – Floremin

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

} 
+0

不需要'= New Member()'应该是'= null',这样你就不会构造一个永远不会被使用的对象。 –

+0

感谢您的评论@ErikPhilips我编辑它 –

+0

@EhsanSajjad这不会为我工作,我总是需要拥有所有成员。我需要显示部分视图,当用户想要查看某个成员的信息 – Gericke

0

我建议不使用TempDataViewBag,因为二者都没有强类型的,直观的(对你或任何人在看你的代码),难维护,等等等等,首先创建您的视图模型:

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 
} 
+0

我喜欢这个逻辑,但在我的情况下,它不会工作。所有成员需要退回 – Gericke

+0

您的问题不是很清楚,或者您不了解我的设计。此设计返回所有成员或单个成员。该视图还允许所有成员或单个成员。我没有看到问题。 –