2011-09-02 108 views
1

我有一个名为Lookup的实体,它具有复杂的类型描述,包含两个字符串英语和法语。出现了一段时间没有价值将被存储到查找中。现在其他实体将查找作为属性,因此我们可以使用foo.Lookup.Description.English作为示例。MVC Razor WebGrid可空复合类型

我正在尝试使用Web网格来显示被选中的信息。

本来我的控制器看起来像

public ViewResult Index() 
    { 
     var foos = db.Foos; 

     return View(foo.ToList()); 
    } 

和我的观点看起来像

@model IEnumerable<Foo> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Stay Manager</h2> 

@{ 
    var grid = new WebGrid(Model, defaultSort: "sortMe", rowsPerPage: 3); 
    grid.GetHtml(htmlAttributes: new { id = "DataTable" }); 
} 

@grid.GetHtml(columns: grid.Columns(
     grid.Column("Lookup.Description.English", "Column Header") 
)) 

我的问题是,查找有时可以为空,生病会得到一个错误,该列查找。 Description.English不存在。

我找到了一个解决方案,但不是非常优雅的一个,并希望有一个更好的方法。我的解决办法是改变我的控制器行动

public ViewResult Index() 
    { 
     var foos = db.Foos; 

     foreach (Foo currentFoo in Foos.Where(s => s.Lookup == null)) 
     {     
      Foo.Lookup = new Lookup(); 
      Foo.Lookup.Description.English = ""; 
      Foo.Lookup.Description.French = "";    
     } 

     return View(foos.ToList()); 
    } 

如何让网络网格与空能复杂类型更好的工作有什么建议?

回答

4

与webgrid完全不同的是,但下面是否会为您提供解决方案? 我做了如下简单的模型:

public class Foo 
{ 
    public string Name { get; set; } 
    public Lookup Lookup { get; set; } 
} 

public class Lookup 
{ 
    public string Name { get; set; } 
    public Description Description { get; set; } 
} 

public class Description 
{ 
    public string English { get; set; } 
    public string French { get; set; } 
} 

控制器动作(我没有一分贝,所以我嘲笑一些数据):

public ViewResult Index() 
{ 
    //var foos = db.Foos; 

    var foos = new List<Foo>(); 

    foos.Add(new Foo { Name = "Foo1" }); 
    foos.Add(new Foo 
    { 
     Name = "Foo2", 
     Lookup = new Lookup 
     { 
      Name = "Lookup2", 
      Description = new Description 
      { 
       English = "englishFoo2", 
       French = "frenchFoo2" 
      } 
     } 
    }); 
    foos.Add(new Foo 
    { 
     Name = "Foo3", 
     Lookup = new Lookup 
     { 
      Name = "Lookup3", 
      Description = new Description 
      { 
       //English = "englishFoo3", 
       French = "frenchFoo3" 
      } 
     } 
    }); 
    foos.Add(new Foo { Name = "Foo4" }); 
    foos.Add(new Foo 
    { 
     Name = "Foo5", 
     Lookup = new Lookup 
     { 
      Description = new Description 
      { 
       English = "englishFoo5", 
       French = "frenchFoo5" 
      } 
     } 
    }); 
    foos.Add(new Foo { 
     Name = "Foo6", 
     Lookup = new Lookup 
     { 
      Name = "Lookup6" 
     } 
    }); 


    return View(foos); 
} 

所以,我现在有FOOS有或没有查找(有或没有说明)。

视图如下:

@model IEnumerable<Foo> 

@{ 
    var grid = new WebGrid(Model, defaultSort: "sortMe", rowsPerPage: 10); 
    grid.GetHtml(htmlAttributes: new { id = "DataTable" }); 
} 
@grid.GetHtml(
columns: grid.Columns(
    grid.Column(
     columnName: "Name", 
     header: "Foo" 
    ), 
    grid.Column(
     columnName: "Lookup.Name", 
     header: "Lookup", 
     format: @<span>@if (item.Lookup != null) 
         { @item.Lookup.Name } 
     </span> 
    ), 
    grid.Column(
     columnName: "Lookup.Description.English", 
     header: "Description.English", 
     format: @<span>@if (item.Lookup != null && item.Lookup.Description != null) 
         { @item.Lookup.Description.English } 
     </span> 
    ), 
    grid.Column(
     columnName: "Lookup.Description.French", 
     header: "Description.French", 
     format: @<span>@if (item.Lookup != null && item.Lookup.Description != null) 
         { @item.Lookup.Description.French } 
     </span> 
    ) 
) 
) 

这对于我(Asp.Net MVC 3)工作得很好,它procudes下面的HTML:
[剪断]

<tr> 
    <td>Foo4</td> 
    <td><span></span></td> 
    <td><span></span></td> 
    <td><span></span></td> 
</tr> 
<tr> 
    <td>Foo5</td> 
    <td><span></span></td> 
    <td><span>englishFoo5 </span></td> 
    <td><span>frenchFoo5 </span></td> 
</tr> 
<tr> 
    <td>Foo6</td> 
    <td><span>Lookup6</span></td> 
    <td><span></span></td> 
    <td><span></span></td> 
</tr> 

[/snip]

+0

谢谢,但没有去。 使用网格时的模型是Ienumerable 。网格不允许为每行提供单独的逻辑。 我认为我坚持我目前的情况.. –

+0

你的意思是说,你正在使用的实际视图有它的模型定义为IEnumerable 而不是IEnumerable (或任何你想要的实体)? –

+0

没有它的IEnumerable ,但是因为它的集合,你不能访问单个Foo的属性,直到选中一个。网格不会为要测试的项目提供“行特定”属性。对不起,如果这是令人困惑。 –