Html.Action asp.net mvc

时间:2010-09-17 04:25:52

标签: asp.net-mvc-2 html-helper

我正在一个网站(Asp.net mvc)上工作,我有多个局部视图。其中一个视图是用户信息,然后在下面几乎没有其他视图说明用户的书籍,给定书籍中的文章等,这就是我的控制器的样子。

public class UserController : Controller
{

   public ActionResult UserInfo(long userid)
   {
        var model.User = LoadUser(userId);
        return View(model);
   } 

   public ActionResult Books(long userId)
   {
        var model.User = LoadUser(userId);
        model.Books = LoadBooks(userId);

        return View(model);
   } 

   public ActionResult Articles(long bookId)
   {
        var model.User = LoadUserByBookId(bookId);
        model.Book = LoadBook(bookId);
        model.Articles= LoadArticles(bookId);

        return  View(model);
   } 

} 

我为UserInfo,Books和Articles创建了三个部分视图,并从给定视图传递数据。现在你可以看到每种方法都变得更加复杂。我正在阅读有关Html.Action助手的内容,它可以加载单独的部分视图。但正如您所看到的,我需要将一些数据从Html.Action助手传递给方法,以便它可以相应地加载数据,例如加载userinfo,我需要传递userId。

如何使用此方法或任何其他更好的方法实现此目的。帮助将不胜感激。

此致 Parminder

2 个答案:

答案 0 :(得分:2)

在视图中,Html.RenderAction()将执行控制器,然后将其作为部分返回视图。你可以像这样使用它:

<%: Html.RenderAction("Articles", new { bookId = 3 }) %>

第一个参数,“Articles”是你的action方法的名字,第二个参数是一个C#匿名对象。我们创建一个bookId属性并将其设置为3.这将从Articles操作方法返回的Articles视图呈现到当前视图中。祝你好运!

答案 1 :(得分:1)

在我看来,兰斯提供了这个解决方案的最后一步。显然,如果在描述时使用Html.RenderAction,则必须有另一个已被调用的Controller Action,因为我们现在在更大的视图中渲染动作(部分视图)。

我认为你需要的是一个需要在主控制器动作中填充的ViewModel

public class PageInfo
{
    public long UserId { get; set; }
    public long BookId { get; set; }
}

主要行动

....
public ActionResult MainAction()
{
     // you probably have some logic here that gets the actual userid and bookid

     PageInfo theModel = new PageInfo(){UserId = 39894, BookId = 3};
     return View(theModel);
}

然后在MainAction页面内调用RenderAction

<%: Html.RenderAction("Articles", new { bookId = Model.BookId }) %>
<%: Html.RenderAction("UserInfo", new { userId = Model.UserId }) %>
<%: Html.RenderAction("Books", new { userId = Model.UserId }) %>