【问题标题】:MVC Partial Views in Site.MasterSite.Master 中的 MVC 部分视图
【发布时间】:2011-12-05 15:52:24
【问题描述】:

我正在尝试在我的 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"); %>

用户控制器.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 行并将模型传递给视图,那么它可以正常工作。但是我的 HomeController 需要一个不同的模型,那么我将如何将 2 个模型传递给视图?

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-partialview


    【解决方案1】:

    调用RenderPartial直接渲染视图,继承父模型。

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

    【讨论】:

    • 我将代码更改为以下内容: 但我现在得到一个不同的错误:执行处理程序“System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper”的子请求时出错。
    • 查看InnerException发现问题。您可能忘记指定控制器名称。
    • InnerException 说:{“在控制器 'TimeAttendanceMVC.Controllers.HomeController' 上找不到公共操作方法 'LoginInfo'。”}。我不知道如何解决这个问题。我是否也应该向我的 HomeController 添加一个新的 LoginInfo 操作?此操作存在于我的 UsersController 中。
    • 否;您应该将, "Users" 添加到RenderAction 调用中以指定控制器。
    • 好的。我现在正在使用它: 但我仍然收到错误:{“在控制器 'TimeAttendanceMVC.Controllers.UsersController' 上找不到公共操作方法 'LoginInfo'。”}
    【解决方案2】:

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

    // 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); %>
    

    【讨论】:

    • 嗯。不知道如何做到这一点或父 ViewModel 是什么。在这方面仍然很新,我只是想启动我的第一个 MVC 应用程序。
    • 我更新了我的答案。父 ViewModel 是指您的 Controller 传递给 View 以进行渲染的单个模型包含一个子属性,该属性充当局部视图的模型。在上面的例子中,您将看到 MyViewModel 包含一个传递给 UserInfo 部分的 UserInfo 属性。希望这会有所帮助!
    • 谢谢。我会试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多