Частичные представления MVC в Site.Master

Я пытаюсь отобразить частичное представление в моем файле Site.Master, но продолжаю получать сообщение об ошибке (ссылка на объект не установлена ​​на экземпляр объекта). Если я обращаюсь к представлению напрямую, я получаю необходимую мне информацию, но если я обращаюсь к представлению индекса из HomeController, я получаю сообщение об ошибке. Частичное представление будет отображать вошедшего в систему пользователя, отдел и роль. Это мой код.

Папка контроллеров -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();

        }

С приведенным выше кодом я получаю сообщение об ошибке. Если я не комментирую 2 строки в моем HomeController и передаю модель в View, то она работает нормально. Но моему HomeController потребуется другая модель, так как же передать 2 модели в представление?

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


person MikeB55    schedule 05.12.2011    source источник


Ответы (2)


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

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

person SLaks    schedule 05.12.2011
comment
Я изменил свой код на следующий: ‹% Html.RenderAction (LoginInfo); % ›Но теперь я получаю другую ошибку: Ошибка выполнения дочернего запроса для обработчика System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper. - person MikeB55; 05.12.2011
comment
Посмотрите на InnerException, чтобы найти проблему. Вы, наверное, забыли указать имя контроллера. - person SLaks; 05.12.2011
comment
InnerException сообщает: {Открытый метод действия LoginInfo не найден на контроллере TimeAttendanceMVC.Controllers.HomeController.}. Я не знаю, как это исправить. Должен ли я добавить новое действие LoginInfo в свой HomeController? Это действие присутствует в моем UsersController. - person MikeB55; 05.12.2011
comment
Нет; вы должны добавить , "Users" к вызову RenderAction, чтобы указать контроллер. - person SLaks; 05.12.2011
comment
Ok. Сейчас я использую это: ‹% Html.RenderAction (LoginInfo, Users); % ›, Но я все равно получаю сообщение об ошибке: {Открытый метод действия LoginInfo не найден на контроллере TimeAttendanceMVC.Controllers.UsersController.} - person MikeB55; 05.12.2011
comment
Понятно. На самом деле у меня не было LoginInfo в качестве действия. У меня было действие Index, которое вызывало это: return View (LoginInfo, model); Я создал новое действие LoginInfo, и теперь оно работает. Большое спасибо за Вашу помощь. - person MikeB55; 05.12.2011

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

// 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); %>
person Phil Klein    schedule 05.12.2011
comment
Хм. Не знаю, как это сделать или что такое родительская ViewModel. Все еще очень новичок в этом, и я просто пытаюсь запустить свое первое приложение MVC. - person MikeB55; 05.12.2011
comment
Я обновил свой ответ. Под родительской ViewModel я подразумеваю, что единственная модель, которую ваш контроллер передает в представление для рендеринга, включает дочернее свойство, которое действует как модель для частичного представления. В приведенном выше случае вы увидите, что MyViewModel включает свойство UserInfo, которое передается в партиал UserInfo. Надеюсь это поможет! - person Phil Klein; 05.12.2011
comment
Спасибо. Я попробую. - person MikeB55; 05.12.2011