如何使SelectList使用ToString()方法同时显示元素和设置dataValueField属性

Yod*_*oda 1 .net asp.net-mvc html.dropdownlistfor razor asp.net-mvc-5.1

有4个重载SelectList.我希望DropDownList在它们内部的属性串联中显示元素(exacly as result ToString()method)并记住它们的id dataValueField.

如果我使用:

  1. @Html.DropDownListFor(m => m.CallsToMake, new SelectList(Model.CallsToMake.OrderByDescending(call => call.TimeStamp)))

我将DropDownList通过ToString()方法的结果得到哪些'元素是好的,但是我没有通过:dataValueField属性(我希望它是Id).

ToString()方法如下:

public override string ToString() {
            return Caller.UserName + " called at " + TimeStamp;
    }
Run Code Online (Sandbox Code Playgroud)

要么

  1. @Html.DropDownListFor(m => m.CallsToMake, new SelectList(Model.CallsToMake.OrderByDescending(call => call.TimeStamp), "Id", "TimeStamp"))

在这里我传递IddataValueField参数,但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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

Mardoxx的解决方案显示添加属性,但我担心实体框架会将此属性添加到表中并再次将所有数据存储在其中.

Yod*_*oda 7

答案很简单.只需传递null给dataTextField,它将使用ToString():

@Html.DropDownListFor(m => m.CallsToMake, new SelectList(Model.CallsToMake.OrderByDescending(call => call.TimeStamp), "Id", null), new { @class = "btn btn-default dropdown-toggle", style = "width: 500px;" })
Run Code Online (Sandbox Code Playgroud)

微软的文档显示缺乏这里.