将两个视图合并为一个vs返回两个视图以进行相同的控制器操作

时间:2017-11-24 21:53:39

标签: c# asp.net-mvc razor

在ASP.NET MVC中,我有一个BooksController,它提供了查看书籍的功能。我希望www.mydomain.com/books返回我所有图书的清单(以及相关的#34;所有图书和#34; html页面),而www.domain.com/books/c-sharp-for-dummies则可以获取&#的所有信息34; C#for dummies"本书(再次,使用它"单书和#34; html页面)。

使用Index参数创建bookName方法非常简单。

public class BooksController
{
     public ActionResult Index(string bookName)
     {
         if (string.IsNullOrEmpty(bookName)
         {
           //return all books here
         }
         else
         {
            //return single book here 
         }
     }
}

Index有相关的Index.cshtml观看页面,但是我必须在视图中进行剃刀检查以确定是否加载"所有书籍" HTML / CSS,或者#34;单本书" HTML / CSS - 就像视图包含两个页面一样,我觉得这是违反直觉的。

对这种情况有什么好的(甚至是传统的)方法?我只创建了两个cshtml文件,一个用于"所有书籍和#34;一个用于"单本书",并根据是否提供bookName参数返回相应的视图?

public class BooksController
{
     public ActionResult Index(string bookName)
     {
         if (string.IsNullOrEmpty(bookName)
         {
           //return all books viewmodel and related  view             
         }
         else
         {
            //return single book viewmodel and related view 
         }
     }
}

1 个答案:

答案 0 :(得分:3)

您应该在控制器中创建2个单独的操作方法。一个用于返回包含所有书籍的视图,另一个用于返回单个书籍的详细信息。

您可以通过这种方式定义路由定义,以便请求来自yourSite/books,它将由索引操作和yourSite/books/somebookname处理,它将由{{1}处理动作方法。以下是attribute routing的使用方法。

Details

现在,在public class BooksController : Controller { [Route("books")] public ActionResult Index() { // to do : Get all the books and pass it to the view. return View(); } [Route("books/{bookName}")] public ActionResult Details(string bookName) { // to do : Get single book using the bookName parameter // and pass that to the view. return View(); } } 视图中,您可以显示所有图书,在index.cshtml视图中,您可以显示特定图书的详细信息。