.net 如何使SelectList使用ToString()方法显示元素并同时设置dataValueField属性
.net 如何使SelectList使用ToString()方法显示元素并同时设置dataValueField属性,.net,asp.net-mvc,razor,html.dropdownlistfor,asp.net-mvc-5.1,.net,Asp.net Mvc,Razor,Html.dropdownlistfor,Asp.net Mvc 5.1,SelectList有4个重载。我想将DropDownList中的元素显示为它们内部属性的串联(例如作为resultToString()方法),并在dataValueField中记住它们的id 如果我使用: @Html.DropDownListFor(m=>m.CallsToMake,新选择列表(Model.CallsToMake.OrderByDescending(call=>call.TimeStamp))) 我将获得DropDownListwhich'元素,该元素由ToString()方法
SelectList
有4个重载。我想将DropDownList
中的元素显示为它们内部属性的串联(例如作为resultToString()
方法),并在dataValueField
中记住它们的id
如果我使用:
@Html.DropDownListFor(m=>m.CallsToMake,新选择列表(Model.CallsToMake.OrderByDescending(call=>call.TimeStamp)))
DropDownList
which'元素,该元素由ToString()
方法的结果表示,该方法很好,但我没有传递:dataValueField
属性(我希望它是Id
)
ToString()
方法如下所示:
public override string ToString() {
return Caller.UserName + " called at " + TimeStamp;
}
或
@Html.DropDownListFor(m=>m.CallsToMake,新选择列表(Model.CallsToMake.OrderByDescending(call=>call.TimeStamp),“Id”,“TimeStamp”)
Id
传递给dataValueField
参数,但是dataTextField
是由TimeStamp
初始化的,我想在这里得到ToString()
的结果,这样用户就可以读取DropDownList
CallToMake
类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApplication2.Models {
public class CallToMake {
public int Id { get; set; }
public virtual Person Callee { get; set; }
public virtual ApplicationUser Caller { get; set; }
public DateTime TimeStamp { get; set; }
public override string ToString() {
return Caller.UserName + " called at " + TimeStamp;
}
}
}
编辑
Mardoxx的解决方案显示添加属性,但实体框架会将此属性添加到表中,并再次将所有数据存储在表中,我对此感到震惊。将以下属性添加到
CallToMake
public String StringVal { get { return Caller.UserName + " called at " + TimeStamp; } set; }
然后在html中使用下面的
@Html.DropDownListFor(m => m.CallsToMake, new SelectList(Model.CallsToMake.OrderByDescending(call => call.TimeStamp), "Id", "StringVal"))
(如果您在其他地方使用被重写的
ToString()
函数,请使StringVal
的getter返回this.ToString()
)将以下属性添加到CallToMake
public String StringVal { get { return Caller.UserName + " called at " + TimeStamp; } set; }
然后在html中使用下面的
@Html.DropDownListFor(m => m.CallsToMake, new SelectList(Model.CallsToMake.OrderByDescending(call => call.TimeStamp), "Id", "StringVal"))
(如果您在其他地方使用被重写的
ToString()
函数,请使StringVal
的getter返回this.ToString()
)答案非常简单。只需将null
作为dataTextField传递,它将使用ToString()
:
微软的文档在这里显示了它的不足。答案非常简单。只需将
null
作为dataTextField传递,它将使用ToString()
:
Microsoft的文档在这里显示缺少。那么属性将由实体框架存储在数据库中,因此存储冗余数据(记录大小的两倍)?好问题,我不知道。我很想在您的模型上创建一个新函数,该函数返回一个带有正确格式数据的
SelectList
。它会将此属性添加到数据库中,因此不应该这样做。但如何在模型中创建这个额外的方法,在模型中还有什么比在Razor视图中做的更多呢?请说明如何创建这样的函数。那么属性是否将通过实体框架存储在数据库中,从而存储冗余数据(记录大小的两倍)?好问题,我不知道。我很想在您的模型上创建一个新函数,该函数返回一个带有正确格式数据的SelectList
。它会将此属性添加到数据库中,因此不应该这样做。但如何在模型中创建这个额外的方法,在模型中还有什么比在Razor视图中做的更多呢?请演示如何创建这样的函数。我不敢相信这还没有被标记为答案或投票通过。@sgrassie非常感谢您的赞赏,在收到任何反馈之前,我可能会觉得接受自己的答案很粗鲁。真不敢相信这还没有被标记为答案或投票率更高。@sgrassie非常感谢您的赞赏,在收到任何反馈之前,我可能会觉得接受自己的答案很粗鲁。