添加了SqlFunctions.StringConvert不必要的填充

时间:2011-05-27 23:51:43

标签: asp.net entity-framework asp.net-mvc-3

在我的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。

我可以简单地指定长度参数,但这不是动态的。

有没有人看过这个问题,或者有解决方案?

谢谢, 尼克

4 个答案:

答案 0 :(得分:33)

将其更改为:

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

答案 1 :(得分:2)

更新

下面的

Tim's answer是一个比这个更好的解决方案,但是我无法删除已接受的答案,并且OP没有回复我接受他答案的请求。

原始答案

最简单的方法可能是将转换工作卸载到服务器上,而不是数据上下文。如果您将数据层与表示层分开,则会自动执行此操作。但为简单起见,我将坚持您当前的架构:

            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 :(得分:0)

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

        }
    }
}

答案 3 :(得分:0)

与LINQ to Entities一起使用的另一个选项是使用隐式类型转换(例如Value = "" & status.Id)进行连接。但是,如果要使用此方法使用多个串联,这将导致必须解决的问题。