【问题标题】:MVC Routing and Partial ViewMVC 路由和局部视图
【发布时间】:2014-04-22 18:59:35
【问题描述】:

好的,我有 2 两个问题:

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

当前对控制器类型“HomeController”的操作“ViewMembers”的请求在以下操作方法之间不明确: ServingTeam.Controllers.HomeController 类型上的 System.Web.Mvc.ActionResult ViewMembers(Int32) ServingTeam.Controllers.HomeController 类型上的 System.Web.Mvc.ActionResult 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 - 如何在显示成员列表的视图中显示单个对象?我创建了一个局部视图来显示成员的信息,但它不允许我这样做。

任何帮助将不胜感激

【问题讨论】:

  • 使用 ajax 调用来填充局部视图。在这里查看我的答案stackoverflow.com/questions/19643864/…。使用 ajax 调用,您可以将方法名称更改为独特的名称,以消除其他错误
  • 我不想使用 ajax 调用

标签: asp.net-mvc


【解决方案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 的情况。

【讨论】:

  • 问题是我想在列表所在的同一视图中返回成员的信息
  • ViewBag["SelectedMember"] 真的会有像原始对象这样的属性吗?我能像 ViewBag["SelectedMember"].Name 一样使用它吗?
  • 您会将ViewBag["SelectedMember"] 的值传递到您的局部视图中。从那里开始,在局部视图中,您将正常使用模型并使用 Model.Name 等。
  • 我不知道该怎么做,你能不能给我发一些代码?
  • 如果您发布您的视图和部分视图的相关部分,我可以修复它。
【解决方案2】:

我建议不要使用 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&lt;int&gt; 创建单个操作。为什么可以为空?因为使用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
}

【讨论】:

  • 我喜欢这个逻辑,但在我的情况下它不起作用。所有成员都需要返回
  • 要么你的问题不是很清楚,要么你不理解我的设计。此设计返回所有成员或单个成员。该视图还允许所有成员或单个成员。我没有看到问题。
【解决方案3】:

你为什么要做两个不同的动作。一个动作就可以为您完成这项工作:

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

}

【讨论】:

  • 不需要= New Member() 应该只是= null,这样你就不会构造一个从未使用过的对象。
  • @EhsanSajjad 这对我不起作用,我总是需要所有成员。当用户想查看某个成员的信息时,我需要显示部分视图
  • 你也可以返回部分视图,有什么问题
  • 我遇到的问题是我无法在返回 List 的视图中返回单个对象。局部视图返回单个对象
  • 如果可以返回局部视图,否则可以返回视图不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多