SqlFunctions.StringConvert добавлено ненужное дополнение

В моей модели ViewModel я возвращаю следующее для выпадающего списка:

public IEnumerable<SelectListItem> Statuses
    {
        get
        {
            using (var context = new AssetManager.Models.AssetManagerEntities())
            {
                var query = from status in context.AssetStatuses
                            where status.Reserved != true
                            select new SelectListItem()
                                       {
                                           Value = SqlFunctions.StringConvert((double)status.Id),
                                           Text = status.Name,
                                           Selected = false
                                       };

                return query.ToList();
            }
        }
    }

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

 @Html.DropDownListFor(model => model.Status, (IEnumerable<SelectListItem>)Model.Statuses)

Все работает нормально, за исключением того, что SqlFunctions.StringConvert по умолчанию делает строку длиной 10, поэтому я получаю это в html:

<option value="         7">Free to loan</option>

Обратите внимание на интервал в поле значения. Это проблема, потому что мой ViewModel требует, чтобы это поле было int.

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

Кто-нибудь видел эту проблему или имел разрешение на нее?

Спасибо, Ник

Ответы

Ответ 1

Самый простой способ сделать это, вероятно, состоит в том, чтобы выгрузить усилия преобразования на ваш сервер, а не контекст данных. Если вы разделили свой уровень данных с уровня представления, это произойдет автоматически. Но для простоты я просто придерживаюсь вашей текущей архитектуры:

            var query = from status in context.AssetStatuses
                        where !status.Reserved
                        select new 
                                   {
                                       status.Id,
                                       status.Name
                                   };
            return query.AsEnumerable()
                .Select(status => new SelectListItem
                                   {
                                       Value = status.Id.ToString(),
                                       Text = status.Name,
                                       Selected = false
                                   })
                .ToList();

Ответ 2

Измените его на:

Value = SqlFunctions.StringConvert((double)status.Id).Trim(), 

Ответ 3

public IEnumerable<SelectListItem> Statuses
{
    get
    {
        using (var context = new AssetManager.Models.AssetManagerEntities())
        {
            return  (from status in context.AssetStatuses.ToList()
                        where status.Reserved != true
                        select new SelectListItem()
                                   {
                                       Value = status.Id.ToString(),
                                       Text = status.Name,
                                       Selected = false
                                   });

        }
    }
}

Ответ 4

Еще одна опция, которая работает с LINQ to Entities, заключается в выполнении конкатенации с неявным преобразованием типа, например Value = "" & status.Id. Тем не менее, это вызовет проблемы, которые необходимо будет обработать, если вы хотите использовать множественную конкатенацию с помощью этого метода.