2011-12-05 4 views
1

Я пытаюсь отобразить частичный вид в моем файле Site.Master, но я продолжаю получать ошибку (ссылка на объект не установлена ​​в экземпляр объекта). Если я сразу получаю доступ к представлению, я получаю информацию, которая мне нужна, но если я получаю доступ к представлению индекса из HomeController, я получаю сообщение об ошибке. В частичном представлении будут отображаться зарегистрированные пользователи, отдел и роль. Это мой код.MVC Partial Views in 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, и я передаю модель в представление, то она отлично работает. Но моему HomeController понадобится другая модель, так как я могу передать 2 модели в представление?

Любые идеи, что я делаю неправильно? Я все еще изучаю MVC прямо сейчас, поэтому я не так хорош в этом. Любая помощь будет оценена по достоинству. Благодарю.

ответ

2

Вызов RenderPartial визуализирует представление напрямую, наследуя модель родителя.

Вместо этого вы должны вызвать RenderAction, чтобы отобразить дочернее действие, чтобы действие могло передать правильную модель частичному представлению.

+0

Я изменил свой код следующим образом: <% Html.RenderAction ("LoginInfo"); %> но теперь я получаю другую ошибку: Ошибка выполнения дочернего запроса для обработчика 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'. – MikeB55

+0

Посмотрите на InnerException, чтобы найти проблему. Возможно, вы забыли указать имя контроллера. – SLaks

+0

InnerException говорит: {«Открытый метод действия« LoginInfo »не найден на контроллере« TimeAttendanceMVC.Controllers.HomeController ».}. Я не знаю, как это исправить. Должен ли я добавить новое действие LoginInfo в свой HomeController? Это действие присутствует в моем UserController. – MikeB55

0

Ваш контроллер может передавать одну модель в представление для рендеринга. Вместо того, чтобы пытаться использовать две модели или вызвать два метода действий в запросе с помощью RenderAction, рассмотрели ли вы создание родительского типа ViewModel?

// 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.RenderPartial("LoginInfo", Model.UserInfo); %> 
+0

Хм. Не знаете, как это сделать или что такое родительский ViewModel. Все еще очень новое в этом, и я просто пытаюсь запустить свое первое приложение MVC. – MikeB55

+0

Я обновил свой ответ. По родительскому представлению ViewModel я имею в виду, что единственная модель, которую ваш контроллер передает в представление для рендеринга, включает дочернее свойство, которое действует как модель для частичного представления. В приведенном выше примере вы увидите, что MyViewModel включает свойство UserInfo, которое передается в части UserInfo. Надеюсь это поможет! –

+0

Спасибо. Я попробую. – MikeB55

Смежные вопросы