从一个视图返回到不同的控制器

时间:2016-05-15 14:37:36

标签: c# asp.net-mvc model-view-controller view controller

我有实体BookShelf和Book。路由是:{controller}/{action}/{id}

从ID = 2的书架获取图书的网址是

.../BookShelves/ManageBookShelves?shelfId=2

当书籍被退回时,可以点击书籍名称并查看书籍的详细信息。这是另一个控制器的动作方法:

.../Books/Details/1

视图上有链接返回索引方法的详细信息:

@Html.ActionLink("Back", "Index")

当我直接从BooksController查看详细信息时,它工作正常。但是当我从BookShelvesController到达那里时,我需要返回特定书架上的书籍列表,这里:

.../BookShelves/ManageBookShelves?shelfId=2

问题是如何根据被调用的动作/控制器使视图返回?

1 个答案:

答案 0 :(得分:1)

我相信Books和BookShelves有一对一的关系。这意味着,一本书可能只是一个书架的一部分。在这种情况下,您必须在db表中再次存储每本书的书架,因此您的Book表(以及Book实体类)中将有BookShelveId

在BookDetails页面中,当您获得Book记录/实体时,只需使用BookShelveId属性值来构建Back链接。

假设您的BookViewModel看起来像这样

public class BookViewModel
{
   public int Id {set;get;}
   public string Title { set;get;}
   public int ShelveId {set;get;}
}

从“详细信息”操作方法中,也可以设置ShelveId。

public ActionResult Details(int id)
{
   var book=db.Books.FirstOrDefault(s=>s.Id==id);
   if(book!= null)
   {
     var vm=new BookViewModel { Id=id,Title=book.Title,ShelveId=book.BookShelveId};
     return View(vm);
   }
   return View("NotFound");
}

现在在您的视图中,使用ShelveId方法中的视图模型的Html.ActionLink来生成反向链接。

@model BookViewModel
<h2>@Model.Title</h2>
<p>
   @Html.ActionLink("Back","ManageBookShelves","BookShelves",
                                           new {shelfId=Model.ShelveId},null)
</p>

编辑: 根据评论。 如果您希望根据单击链接的位置具有不同的后退按钮行为,则可以在查询字符串中传递该信息。

所以从图书索引页面

@Html.ActionLink("View Details","Details","Book", new {@id=item.Id},null)

来自BookShelve页面

@Html.ActionLink("View Details","Details","Book",
                new {@id=item.Id,shelveId=Model.BookShelveId },null)

现在让你的Details方法接受2个参数,一个可以为空,我们将使ShelveId可以为空。

public class BookViewModel
{
   public int Id {set;get;}
   public string Title { set;get;}
   public int? ShelveId {set;get;}
}

和行动方法。

public ActionResult Details(int id, int? shelveId)
{
  var vm = new BookViewModel{ Id=id };
  // to do : Get book entity and map to view model.(Except the ShelveId property)
  if(shelveId!=null)
  {
    vm.ShelveID=shelveId;
  }
  return View(vm);
}

在视图中,现在检查ShelveId属性并呈现链接

@model BookViewModel
@if(Model.ShelveId==null)
{
  <p>@Html.ActionLink("Back to books","Index","Book")</p>
}
else
{
  <p>@Html.ActionLink("View Details","Details","Book",
                new {@id=item.Id,shelveId=Model.BookShelveId },null)</p>
}