MVC Razor WebGrid Nullable Комплексные типы - PullRequest
1 голос
/ 02 сентября 2011

У меня есть объект под названием Lookup, который имеет сложное описание типа с двумя строками: английским и французским.Возникло время, когда никакое значение не будет сохранено в поиске.Теперь другие объекты имеют поиск в качестве свойств, поэтому у нас может быть, например, foo.Lookup.Description.English.

Я пытаюсь использовать веб-сетку для отображения выбранной информации.

Первоначальномой контроллер выглядел как

    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")
))

Моя проблема в том, что Lookup иногда может быть нулевым, и плохо получит ошибку, сообщив Column Lookup.Description..Английский не существует.

Я нашел решение, но не очень элегантное, и надеялся, что найдется лучший способ.Мое решение состояло в том, чтобы изменить действие моего контроллера на

    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());
    }

Любые предложения о том, как заставить Web Grid работать лучше с нулевыми сложными типами?

1 Ответ

4 голосов
/ 03 сентября 2011

Совсем не знаком с 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), он выдает следующий html:[snip]

<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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...