Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使SelectList使用ToString()方法显示元素并同时设置dataValueField属性_.net_Asp.net Mvc_Razor_Html.dropdownlistfor_Asp.net Mvc 5.1 - Fatal编程技术网

.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
中的元素显示为它们内部属性的串联(例如作为result
ToString()
方法),并在
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非常感谢您的赞赏,在收到任何反馈之前,我可能会觉得接受自己的答案很粗鲁。