2010-07-19 29 views
1

我不知道如何最好地解释这个,所以我已经链接到一个图片,显示问题。我有一个简单的表格,我为每个td项目调用DisplayForModel(),这样我就可以在表格中渲染不同的东西。在asp.net mvc处理空值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单元格。这使我可以根据类型呈现不同的模板。

+0

这是一个有点拉伸,但我甚至尝试在DisplayTemplates下创建一个Null.ascx部分,如果它为null对象,它可能会呈现。 我不感到惊讶,看看这并没有解决我的问题;) – 2010-07-19 14:32:34

回答

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

您应该用您的视图模型的名称替换初学者。所以,如果你有一个名为Person视图模型这将是:

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

现在至少你的partail视图将被强类型到您的视图模型,而不仅仅是一个通用对象。您还可以在构造函数中检查视图模型的值,然后将它们设置为空字符串(如果它们为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上添加一个空检查来做什么。

+0

我已经包含在我的问题,为什么我使用ViewUserControl 正在初始化的视图模型属性为空字符串会付出更多的信息,但需要我通过并为每个模型(我有很多)做到这一点。 我希望能有办法改变这是如何呈现的,所以我只需要做一次。 – 2010-07-19 23:23:49

+0

@Joshua:你能发布更多的代码,所以我们知道你的代码在做什么(如模板,控制器等)。也请尝试此博客文章,看看它是否有帮助:http://haacked.com/archive/2010/05/05/asp-net-mvc-tabular-display-template.aspx – amurra 2010-07-20 11:37:43

+0

嗨amurra,我已经更新了问题用更多的代码来显示表格是如何生成的,并简要说明从控制器到表格中每个单元格的查看和渲染发生了什么。希望有所帮助。 – 2010-07-20 13:43:30