Более аккуратный способ отображения пользовательского класса в ASP.net веб-страница?

#asp.net #html-table

#asp.net #html-таблица

Вопрос:

В настоящее время я делаю следующее:

 @{
    ViewBag.Title = "Prospect";
}
<h2>@ViewBag.Prospect.Name</h2>
<table>
    <tr>
        <td>
            <b>Address1:</b>
        </td>
        <td>@ViewBag.Prospect.Address1
        </td>
    </tr>
    <tr>
        <td>
            <b>Postcode:</b>
        </td>
        <td>@ViewBag.Prospect.Postcode
        </td>
    </tr>
    <tr>
        <td>
            <b>Tel:</b>
        </td>
        <td>@ViewBag.Prospect.Tel
        </td>
    </tr>
    <tr>
        <td>
            <b>Email:</b>
        </td>
        <td>@ViewBag.Prospect.Email
        </td>
    </tr>
</table>
  

Как вы можете видеть, кода МНОГО, он беспорядочный, и что ж, в настоящее время я показываю 4 столбца, когда мне нужно 15!!!

Наверняка должен быть более аккуратный синтаксический способ сделать это? Альтернативы использованию таблицы? Примечание: все столбцы должны быть в строку. и также обратите внимание, что требуется отобразить только 1 запись. Не список записей.

Я знаю, что в ROR это было намного аккуратнее, чем это. Я думаю, что я использовал formtastic или что-то подобное для отображения информации. (Я не хочу редактировать информацию, просто просматриваю ее.)

Ответ №1:

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

Пусть это будет вашим ViewModel :

 public class Prospect
{
    public string Name { get; set }
    public string Address { get; set; }
    public string PostCode { get; set; }
    public string Tel { get; set; }
    public string  Email { get; set; }
}
  

Это ваш Action :

 public ActionResult ViewProspect()
{
    Prospect prospect = new Prospect { 
        Name = "Jackson", 
        Address = "21, Some hills", 
        PostCode = "90210", 
        Tel = "505123412", 
        Email = "jack@son.com" 
    };

    Func<string, string> getStringValue = (value) => value == null ? string.Empty : value.ToString();

    IEnumerable<KeyValuePair<string, string>> prospectKeyValue = typeof(Prospect).GetProperties().Select(
                p => new KeyValuePair<string, string>(p.Name, getStringValue(p.GetValue(prospect, null))));

    ViewBag.Prospect = prospectKeyValue;
    View();
}
  

И вот ваш упрощенный View :

 @{
    ViewBag.Title = "Prospect";
}
<h2>@ViewBag.Prospect.Single(p => p.Key == "Name").Value</h2>
<table>
    @foreach(var keyValue in ViewBag.Prospect)
    {
        <tr>
            <td>
                <b>@keyValue.Key</b>
            </td>
            <td>@keyValue.Value
            </td>
        </tr>
    }
</table>
  

Комментарии:

1. Очень подробный ответ. Огромное спасибо. Пробуем это сейчас.

2. Возникает проблема в случае целочисленных полей. Похоже, они не показывают

3. Просто измените с p.GetValue(prospect, null) as string на p.GetValue(prospect, null).ToString() .

4. а как насчет случая, когда ожидаемое значение равно null? Спасибо

5. Я пошел с (p.Name, (p.GetValue(prospect, null) ?? "").ToString()) , чтобы сохранить дополнительную функцию. Но спасибо! 🙂