【发布时间】:2014-09-07 00:14:14
【问题描述】:
编辑和部分回答:我不知道如何显示多列,但如果不是这样,您必须在 Call 类中覆盖 ToString。
我有一个班级Person(他们接电话):
public class Person {
public int Id { get; set; }
[DisplayName("First Name")]
public string FirstName { get; set; }
[DisplayName("Last Name")]
public string LastName { get; set; }
public virtual ICollection<Call> ReceivedCalls { get; set; }
}
一个班级ApplicationUser(他们打电话):
public class ApplicationUser : IdentityUser {
public virtual ICollection<Call> MadeCalls { get; set; }
}
以及它们之间的关联类Call:
public class Call {
public int Id { get; set; }
public virtual Person Callee { get; set; }
public virtual ApplicationUser Caller { get; set; }
public DateTime TimeStamp { get; set; } //Additional Attribute
}
他们在数据库中合作得很好。但是我在使用@Html.ListBoxFor 方法来显示一个ListBox 时遇到了麻烦,其中的每一行都会显示谁来电以及何时调用:Caller.UserName | Call.TimeStamp 用于收到的每个电话(由人员)。
我想在 Razor View 中显示那些强类型化的信息:
@model WebApplication2.Models.Person
我试过这个:
@Html.ListBoxFor(m => m.ReceivedCalls, new MultiSelectList(Model.ReceivedCalls, "TimeStamp" ), new {Multiple = "multiple"})
它正在被翻译(输出 HTML)为:
<select Multiple="multiple" id="ReceivedCalls" multiple="multiple" name="ReceivedCalls"><option selected="selected">System.Data.Entity.DynamicProxies.Call_2FC3E1C25C19BA21E6B64CAB2894602434775435359AAB76E58C6F8411451A49</option>
<option selected="selected">System.Data.Entity.DynamicProxies.Call_2FC3E1C25C19BA21E6B64CAB2894602434775435359AAB76E58C6F8411451A49</option>
</select>
它看起来像:
问题:如何在每行显示谁来电以及何时调用的 ListBox:Caller.UserName | Call.TimeStamp 显示每个接听电话(按人)。
**编辑:**
有一些语法错误:
// Create collection of anonymous objects (adjust format to suit your needs)
var receivedCalls = person.ReceivedCalls.Select(c => new {
ID = c.Id,
DisplayName = string.Format("{0}: {1:D}", c.Caller.UserName, c.TimeStamp)
});
// Initialise view model
PersonVM model = new PersonVM();
// Map properties from person to model
// Assign select list
model.CallList = new MultiSelectList(receivedCalls, "ID", "DisplaName");
查看:
@Html.ListBoxFor(m => m.ReceivedCalls, new MultiSelectList(Model.ReceivedCalls))
如果我只是覆盖 Call 中的 ToString,结果完全一样:
public override string ToString() {
if (Caller != null)
return Caller.UserName + " called at " + TimeStamp;
return "called at " + TimeStamp;
}
@Html.ListBoxFor(m => m.ReceivedCalls, new MultiSelectList(Model.ReceivedCalls, "TimeStamp"), new { Multiple = "multiple", style = "width: 100%;" })
所以我认为它仍然依赖于 ToString。
【问题讨论】:
标签: c# asp.net-mvc linq entity-framework razor