2010-07-19 49 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