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

问题描述:

我有实体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"); 
} 

现在,在您看来,使用视图模型的ShelveIdHtml.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> 
} 
+0

我可以通过两种方式获得这样的观点: 1)直接从书籍/详细信息/ ID;当我点击“返回”时,我应该回到图书/索引; 2)从/ BookShelves/ManageBookShelves?shelfId,然后是Books/Details/id。这里当我点击“返回”时,我应该返回到BookShelves/ManageBookShelves?shelfId。如何结合这两个变种? – MyName

+0

看看最新的答案。 – Shyju

+1

非常感谢您的帮助!真的行 – MyName