Hi I’m try to display the top 5 messages from the message center on the homepage. But I’m not sure what I’m doing wrong. I try to get the messages from the message view model here is my code.
View model
@model Portal.ViewModel.MemberMessageViewModel
@foreach (var msg in Model.MessageList)
<div> @html.DisplayFor(modelItem => msg.CreatedOn) @html.DisplayFor(modelItem => msg.Subject) </div>
MessageViewModel.cs
public class MemberMessageViewModel : BaseViewModel { public string Subject { get; set; } public string CreatedOn { get; set}
public List<MemberMessageViewModel> MessageList { get; set;}
}
Controller
public async Task<IActionResult>
Homepage()
{
string MESSAGE_PANEL_NAME = _configuration.GetSection(“TemplateStrings”).GetSection(“TEMPLATE_MESSAGECENTER”).Value;
try{
memberHomepageVM.messageDetail = await _messageService.GetHomepageMessages(MESSAGE_PANEL_NAME, Lang);
}
Cshtml
@awaitHtml.PartialAsync(“_message”, Model.messageDetail)
Advertisement
Answer
To display top 5 records, we should use the “OrderByDescending()” to sort the message, and then use the “Take(5)” method to get the top 5 messages.
Please refer the following sample code:
Based on your MemberMessageViewModel create a service, and set initial data:
JavaScript119191public class MessageService : IMessageService
2{
3public List<MemberMessageViewModel> GetHomepageMessages()
4{
5List<MemberMessageViewModel> messagelist = new List<MemberMessageViewModel>()
6{
7new MemberMessageViewModel(){ Subject="S1", CreatedOn=DateTime.Now.ToString()},
8new MemberMessageViewModel(){ Subject="S2", CreatedOn=DateTime.Now.AddDays(-6).ToString()},
9new MemberMessageViewModel(){ Subject="S3", CreatedOn=DateTime.Now.AddDays(-4).ToString()},
10new MemberMessageViewModel(){ Subject="S4", CreatedOn=DateTime.Now.AddDays(-5).ToString()},
11new MemberMessageViewModel(){ Subject="S5", CreatedOn=DateTime.Now.AddDays(2).ToString()},
12new MemberMessageViewModel(){ Subject="S6", CreatedOn=DateTime.Now.AddDays(-8).ToString()},
13new MemberMessageViewModel(){ Subject="S7", CreatedOn=DateTime.Now.AddDays(1).ToString()},
14};
15
16return messagelist;
17}
18}
19
Register the service in the Startup.ConfigureServices method:
JavaScript121services.AddScoped<IMessageService, MessageService>();
2
Homepage controller:
JavaScript119191public async Task<IActionResult> Homepage()
2{
3//get the message list
4var messages = _messageService.GetHomepageMessages()
5.OrderByDescending(c => Convert.ToDateTime(c.CreatedOn)) //sort the message based on the CreatedOn property.
6.Take(5) //take the top 5 messages.
7.ToList();
8
9//according to your view page bind model, it seems that you want to return a MemberMessageViewModel.
10MemberMessageViewModel member = new MemberMessageViewModel()
11{
12CreatedOn = DateTime.Now.ToString(),
13Subject = "Subject A",
14MessageList = messages,
15};
16//
17return View(member);
18}
19
Homepage view page(Homepage.cshtml):
JavaScript110101@model Test.Models.MemberMessageViewModel
2
3@foreach (var msg in Model.MessageList)
4{
5<div>
6@Html.DisplayFor(modelItem => msg.CreatedOn)
7@Html.DisplayFor(modelItem => msg.Subject)
8</div><br/>
9}
10
The output as below:
Besides, you could also sort and take the messages from the View page:
@model Test.Models.MemberMessageViewModel
@foreach (var msg in Model.MessageList.OrderByDescending(c => Convert.ToDateTime(c.CreatedOn)).Take(5))
{
<div>
@Html.DisplayFor(modelItem => msg.CreatedOn)
@Html.DisplayFor(modelItem => msg.Subject)
</div><br/>
}
If I misunderstand your problem, please let me know freely.