我有实体BookShelf和Book。路由是:{controller}/{action}/{id}
从ID = 2的书架获取图书的网址是
.../BookShelves/ManageBookShelves?shelfId=2
当书籍被退回时,可以点击书籍名称并查看书籍的详细信息。这是另一个控制器的动作方法:
.../Books/Details/1
视图上有链接返回索引方法的详细信息:
@Html.ActionLink("Back", "Index")
当我直接从BooksController查看详细信息时,它工作正常。但是当我从BookShelvesController到达那里时,我需要返回特定书架上的书籍列表,这里:
.../BookShelves/ManageBookShelves?shelfId=2
问题是如何根据被调用的动作/控制器使视图返回?
答案 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>
}