Расширение SelectList - пара выражений - PullRequest
2 голосов
/ 20 августа 2010

Итак, у меня появилась эта сумасшедшая идея, что я могу заставить что-то классное работать. Я устал от нового списка выбора (item, "blah", "blahblah"), поэтому я начал писать метод расширения (пытаясь получить более строгий тип) примерно так ...

var selectList = projects.ToSelectList(p =>p.ProjectID, p =>p.ProjectName);

метод расширения выглядит примерно так

public static SelectList ToSelectList<T>(this IEnumerable<T> item, 
                           Expression<Func<T, string>> textName, 
                           Expression<Func<T, string>> valueProperty)
    {
        //do cool stuff
        return new SelectList(items, dataTextField, dataValueField);
    }

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

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

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

Я не понимаю, почему вы должны использовать Reflection для этого.

public static SelectList ToSelectListItem<T>(this IEnumerable<T> items, 
    Func<T, string> textName, Func<T, string> valueProperty) {
    {
    return new SelectList(items
            .Select(i => new SelectListItem {Text = textName(i), Value = valueProperty(i)}));
    }
}

должно работать, но у меня нет текущей библиотеки MVC на текущей машине.

0 голосов
/ 20 августа 2010

Это нужно очистить и проверить на такие вещи, как нулевой счет предметов, но вот конечный результат.

public static SelectList ToSelectList<T>(this IEnumerable<T> items, Expression<Func<T, object >> textName, Expression<Func<T, object >> valueProperty)
        {
            var dataTextField = textName.Body.ToString().Split('.')[1];
            var dataValueField = valueProperty.Body.ToString().Split('.')[1];
            return new SelectList(items, dataTextField, dataValueField);
        }
0 голосов
/ 20 августа 2010

Первоначально я также попробовал вашу идею, когда начал работать с MVC, но потом понял, что некоторые поля я хотел отформатировать определенным образом, и как насчет того, когда элемент должен быть выбран по умолчанию. После обработки всего этого я понял, что будет проще написать однострочное выражение LAMDA.

Так что теперь я обычно просто делаю выражение LAMDA для генерации моей коллекции SelectListItem.

<b>Screener: </b><%= Html.DropDownList("ScreenerOI", Model.Screeners.Select(p=>new SelectListItem() { Text = p.firstName + " " + p.lastName, Value = p.OI.ToString() })) %>

<b>Open Time: </b>
                <%= Html.DropDownListFor(c => c.OpenTime, Model.HoursInDay.Select(p => new SelectListItem() { Text = p != null ? DateTime.Now.Date.Add(p.Value).ToString("h:mm tt") : "Clear Time", Value = p != null ? p.ToString() : "", Selected = Model.OpenTime == p }).ToList())%>

Кажется, что это так же ясно, как и то, что происходит, как и ваша идея.

Другой пример

 <b>Screener Status: </b>
                <%= Html.DropDownListFor(c => c.InfoStatusOI, Model.InfoStatuses.Select(p => new SelectListItem() { Text = p != null ? p.Status.ToString() : "", Value = p != null ? p.OI.ToString() : "", Selected = p != null && Model.InfoStatusOI == p.OI }).ToList())%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...