在asp.net mvc DisplayForModel中处理空值

时间:2010-07-19 14:24:01

标签: asp.net-mvc

我不确定如何最好地解释这一点,所以我链接到一张显示问题的图片。我有一个简单的表格,我为每个td项目调用DisplayForModel(),以便我可以在表格内呈现不同的东西。

alt text http://img844.imageshack.us/img844/4142/displayformodelnullvalu.png

我遇到的问题是数据库记录是否为空值。例如,在此屏幕截图中显示地址,电话和传真字段。 DisplayForModel似乎呈现了视图模型的所有属性。

为了给出一些上下文,我在控制器中提取一些记录并将它们选择到一个对象[]中。我使用对象数组而不是字符串等的原因是我可以为不同的对象类型定义模板。

public ActionResult List(int? page, int? departmentId, string search)
    {
        var model = (from e in UserRepository.FindAllUsersThatMatch(CompanyId, departmentId.GetValueOrDefault(-1), search).IsNotDeleted()
                     select new object[] {
                               new Link() { Name = string.Format("{0} {1}", e.Firstname, e.Surname), LinkAddress = Url.Action("Edit", "Employee", new { Id = e.Id} ) } ,
                               e.DateOfBirth,
                               e.StreetAddress,
                               e.Suburb ?? "",
                               e.State,
                               e.Postcode,
                               e.Home,
                               e.Mobile,
                               e.EmailAddress
                   }).ToDynamicListView(page, Request.RequestContext.RouteData, "Employee", "DOB", "Street Address", "Suburb", "State", "Postcode", "Home", "Mobile", "Email");

        return View("List", model);
    }

ToDynamicListView html帮助器设置我的视图模型我调用了DynamicListModel这个模型的行是这样的分页列表;

DynamicListModel model = ...
model.Rows = new PagedList<DynamicListRow>(source, page.Value, 10);

在我看来,我会将此模型传递给部分渲染(渲染您在链接图像中看到的数据表。

<% Html.RenderPartial("DynamicListView", Model); %>

这会为表创建html并执行与

类似的操作
<table>
    <thead>
        <tr><th>header1</th><th>header2</th> etc.</tr>
    </thead>
    foreach (row)
    {
      <tr>
          foreach (cell)
          {
            <td><% Html.RenderPartial("DynamicListCell", cell); %></td>
          }
    } </tr>
</table>

因此每个单元格都使用DisplayForModel进行渲染。部分非常简单,看起来像这样;

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

<%= Html.DisplayForModel()%>

我已经尝试检查传入partial的对象是否为null而不是渲染,但这似乎也不起作用。

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

<% if (Model != null) {%>
    <%= Html.DisplayForModel()%>
<% } %>

我使用ViewUserControl而不是正确的类型部分的原因是因为在行列表中的每个单元格上调用了这个DisplayForPartial。

随着桌子的每个td单元格的进一步提升,提到了这一点。这允许我根据类型渲染不同的模板。

1 个答案:

答案 0 :(得分:0)

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

您应该将startms的名称替换为viewmodel的名称。因此,如果您有一个名为Person的视图模型,那么它将是:

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

现在,至少您的部分视图将强烈输入到您的视图模型,而不仅仅是通用对象。您还可以在构造函数中检查视图模型的值,如果它们为null,则将它们设置为空字符串。

修改

如果您只想显示空值的任何内容,可以在此处添加检查:

<table>
<thead>
    <tr><th>header1</th><th>header2</th> etc.</tr>
</thead>
foreach (row)
{
  <tr>
      foreach (cell)
      {
        <td><% if (cell != null) ? Html.RenderPartial("DynamicListCell", cell) : "&nbsp;" %></td>
      }
} </tr>

这将通过在DisplayForModel周围添加空检查来获得与您尝试的相同的结果。