2011-12-05 76 views
1

我想在我的Site.Master文件中呈现一个局部视图,但我一直收到一个错误(对象引用未设置为对象的实例)。如果我直接访问视图,我会得到我需要的信息,但如果从HomeController访问索引视图,则会出现错误。局部视图将显示登录的用户,部门和角色。这是我的代码。MVC部分视图Site.Master

控制器文件夹 -HomeController.cs -UsersController.cs

Models 
-Repository Folder 
    - UersRepository.cs 
-Repository Interface Folder 
    - IUsers.cs 
-Service Folder 
    - UsersService.cs 
    - IUserService.cs 
-Validation Folder 
    - IValidationDictionary 
    - ModelStateWrapper 

,我试图部分地呈现被称为LoginInfo.ascx的看法,它的定位在共享文件夹。

LoginInfo.cs代码:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Users>>" %> 

<%@ Import Namespace="TimeAttendanceMVC.Models"%> 




<table> 
    <tr> 
     <th> 
      UserName 
     </th> 
     <th> 
      Department 
     </th> 
     <th> 
      UserType 
     </th> 

    </tr> 

<% foreach (var item in Model) { %> 
    <tr> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.UserName) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.Department) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.UserType) %> 
     </td> 

    </tr> 
<% } %> 

</table> 

的Site.Master代码:

<% Html.RenderPartial("LoginInfo"); %> 

UserController.cs

public class UsersController : Controller 
    { 
     // 
     private IUsersService _service; 

     //============================================================================== 
     //============================================================================== 
     public UsersController() 
     { 
      _service = new UsersService(new ModelStateWrapper(this.ModelState)); 
     } 

     public UsersController(IUsersService service) 
     { 
      _service = service; 
     } 

     //============================================================================== 
     //============================================================================== 
     // GET: /Employee/ 
     //============================================================================== 
     //============================================================================== 
     // GET: /Employee/ 
     public ActionResult Index() 
     { 

      var model = _service.Return_UserName_Dept(); 
      return View("LoginInfo", model); 
     } 

    } 

HomeController.cs

public ActionResult Index() 
     { 
      //var model = _service.Return_UserName_Dept(); 
      //return View(model); 
      return View(); 

     } 

随着上面的代码,我得到一个错误。如果我在我的HomeController中取消注释2行并将模型传递给View,那么它工作正常。但是我的HomeController需要一个不同的模型,那么我如何将两个模型传递给View呢?

任何想法我做错了什么?我现在还在学习MVC,所以我不擅长这一点。任何帮助,将不胜感激。谢谢。

回答

2

调用RenderPartial直接呈现视图,继承父级的模型。

您应该调用RenderAction来渲染子动作,以便该动作可以将正确的模型传递给局部视图。

+0

我改变了我的代码如下:

// This model is passed to your view for rendering public class MyViewModel { public string Title { get; set; } public DateTime Date { get; set; } // This property is passed as the model to your partial view public UserInfo UserInfo { get; set; } } public ActionResult Index() { var model = new MyViewModel(); // _service.GetIndexViewModel(); model.UserInfo = _service.Return_UserName_Dept();; return View(model); } 

那么在你看来,你想做些什么<%Html.RenderAction( “LoginInfo类”); %>但我现在得到一个不同的错误:错误执行处理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'的子请求。 – MikeB55

+0

看看InnerException找到问题。您可能忘记指定控制器名称。 – SLaks

+0

InnerException说:{“在控制器'TimeAttendanceMVC.Controllers.HomeController'上没有找到公共操作方法'LoginInfo'。”}。我不知道如何解决这个问题。我是否应该为HomeController添加一个新的LoginInfo动作?这个动作出现在我的UsersController中。 – MikeB55

0

您的控制器能够将单个模型传递给视图进行渲染。您有没有考虑创建一个父ViewModel类型,而不是尝试使用两个模型,或者在使用RenderAction的请求中调用两个Action Methods?

<% Html.RenderPartial("LoginInfo", Model.UserInfo); %> 
+0

嗯。不知道该怎么做或父视图模型是什么。在这方面还是非常新的,我只是想让我的第一个MVC应用程序开始。 – MikeB55

+0

我更新了我的答案。通过父视图模型,我的意思是,您的控制器传递给视图进行渲染的单个模型包括一个充当局部视图模型的子属性。在上面的例子中,你会看到MyViewModel包含一个传递给UserInfo部分的UserInfo属性。希望这可以帮助! –

+0

谢谢。我会试试这个。 – MikeB55