从一个视图返回到不同的控制器
问题描述:
我有实体BookShelf和Book。路由是:{controller}/{action}/{id}
从一个视图返回到不同的控制器
网址正从货架书籍ID = 2是
.../BookShelves/ManageBookShelves?shelfId=2
当归还图书,也可以点击约书簿及查看详细名称。这是另一个控制器的操作方法:
.../Books/Details/1
有上查看详细信息链接返回返回索引方法:
@Html.ActionLink("Back", "Index")
,当我直接从BooksController中详细查看它的工作原理确定。但是,当我从BookShelvesController那里,我必须要返回到对特定的货架书籍列表,在这里:
.../BookShelves/ManageBookShelves?shelfId=2
的问题是如何使视图返回回depeding上称为动作/控制器?
答
我相信Books和BookShelves有一对一的关系。这意味着,一本书可能只是一本书架的一部分。在这种情况下,您必须将每本书再次存储在数据库表中的书架上,因此您的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)
现在有您的详细方法接受2个PARAMS和一个可为空,我们将做出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>
}
我可以通过两种方式获得这样的观点: 1)直接从书籍/详细信息/ ID;当我点击“返回”时,我应该回到图书/索引; 2)从/ BookShelves/ManageBookShelves?shelfId,然后是Books/Details/id。这里当我点击“返回”时,我应该返回到BookShelves/ManageBookShelves?shelfId。如何结合这两个变种? – MyName
看看最新的答案。 – Shyju
非常感谢您的帮助!真的行 – MyName