【问题标题】:strongly-typed partial views MVC RC1强类型部分视图 MVC RC1
【发布时间】:2010-10-12 04:55:39
【问题描述】:

将 ViewData.Model 传递给部分视图时出现问题。即使我将其等同于结果查询,它也始终默认为 null。我无法访问强类型数据,因为模型为空。我现在的代码是这样的,

查看页面

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% Html.RenderPartial("header", this.ViewData.Model); %>
    <% Html.RenderPartial("test", this.ViewData.Model); %>
    <div id="userControls">
    </div>
</asp:Content>

用户控件 - 标题

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %>
<h2>
    ACReport</h2>
<p>
    id:
    <%= Html.Encode(Model.id) %>
</p>
<p>
    type:
    <%= Html.Encode(Model.type) %>
</p>

用户控件 - 测试

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %>

        <%  using (Ajax.BeginForm(
            "pressureV2",
            "Home",
            new { id = ViewData.Model.id },
            new AjaxOptions
            {
                UpdateTargetId = "userControls",
                HttpMethod = "GET"

            },
            new { @id = "genInfoLinkForm" }))
            {%>
        <%= Html.SubmitButton("hey", "Lol") %>

    <%} %>

控制器

public ActionResult header(int id)
        {
            var headerResults = from c in db.information
                                where c.id == id
                                select new information
                                {
                                    id = c.id,
                                    type = c.type
                                };
            ViewData.Model = headerResults.FirstOrDefault();
            return View(ViewData.Model);
        }

public ActionResult pressureV2(int id)
        {
            var pressureVResults = from c in db.pressure_volume_tests
                                   where c.id == id
                                   select new pressureVT
                                   {
                                       bottomCVP = c.bottom_CVP,
                                       topCVP = c.top_CVP
                                   };

            ViewData.Model = pressureVResults.FirstOrDefault();
            return View(ViewData.Model);
        }

【问题讨论】:

  • 所有视图都强类型化到 Models.information 吗?哪个控件返回 ViewPage?
  • 我没有强输入视图只有部分。

标签: asp.net-mvc user-controls strong-typing viewdata partials


【解决方案1】:

我认为问题可能是您在表单中缺少名称为“id”的元素,因此 Action 方法的参数永远不会填充值?

这样查询将始终使用 FirstOrDefault 返回 null,因此返回 null 模型。

只是我的猜测......

【讨论】:

    【解决方案2】:

    您是否尝试过将 ViewPage 也设为通用?

    【讨论】:

      【解决方案3】:

      在 cmets 中,您说过视图不是强类型的。正因为如此:

      <% Html.RenderPartial("header", this.ViewData.Model); %>
      <% Html.RenderPartial("test", this.ViewData.Model); %>
      

      不会工作。如果您将视图强输入到 testMVCProject.Models.information,然后从您的构造函数中传递该类型的实例,它将起作用。

      控制器:

      public ActionResult ShowAView()
      {
          Return View("WhateverYourViewIsCalled", new information());
      }
      

      【讨论】:

      • 因为我在整个视图中都使用局部视图,如果我想向局部视图添加新的查询信息,我是否仅限于从视图本身传递的内容,或者我可以限制在部分?
      • Partials 只能从视图中获取数据。请参阅贾斯汀的回答。
      【解决方案4】:

      RenderPartial 时不会调用控制器 - 它被绕过并直接呈现视图。因此,无论您想作为模型传入什么,都需要从调用视图中完成。

      【讨论】:

      • 你从哪里得到这些信息的,我很确定我可以在调用 renderpartial 方法时访问控制器
      • 个人经验。当您调用 RenderPartial("viewName") 时,视图引擎不会尝试调用控制器方法 - 它会查找名为“viewName”的视图。去试试吧……你也许可以覆盖默认的视图引擎来使用控制器……?
      【解决方案5】:

      您对 Html.RenderPartial 助手的使用有一个误解。 当您使用 RenderPartial 时,您将显示视图而无需从控制器请求模型。

      所以你必须重构你的 ViewPage 并将好的模型传递给你的用户控件:

      示例:

      控制器:

      ActionResult MainView()
      {
          var mainviewobj = new MainViewObject();
      
          var headerResults = from c in db.information
                                      where c.id == id
                                      select new information
                                      {
                                          id = c.id,
                                          type = c.type
                                      };
      
          mainviewobj.info = headerResults.FirstOrDefault();
      
          return view(mainviewobj);   
      }
      

      查看代码:

      <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
          <% Html.RenderPartial("header", this.ViewData.Model.info); %>
          <% Html.RenderPartial("test", this.ViewData.Model.info); %>
          <div id="userControls">
          </div>
      </asp:Content>
      

      查看后面的代码

      public partial class MainView : ViewPage<MainViewObject>
      {
      }
      

      现在模型在您的用户控件中不会为空。 但请记住,用户控件渲染部分未执行控制器中的代码 所以你不需要控制器中的public ActionResult header(int id)

      希望这会有所帮助。

      【讨论】:

      • 我试图避免代码隐藏文件,我不确定这种方法是否适用于动态模型重载
      【解决方案6】:

      我发现这对我有用,像这样引用部分内容。

      ...form
          @Html.Partial("_AboutYou", Model.AboutYou);
       ..end form
      

      在顶部的局部视图中...

      @model <namespace1>.<namespace2>.<namespace3>.CustomerInfo.AboutYou
          @{
      
              ViewData.TemplateInfo.HtmlFieldPrefix = "AboutYou";
      
              if (this.ViewContext.FormContext == null)
              {
                  this.ViewContext.FormContext = new FormContext();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 2013-04-10
        • 2013-04-23
        相关资源
        最近更新 更多