ListView 中 MVC 5 的下拉列表(Viewmodel 的 IEnumerable)
Dropdownlistfor MVC 5 in ListView (IEnumerable of Viewmodel)
我正在做一个学校项目,但在我看来我被困在一个下拉列表中。所以这是我的 ViewModel:
using System;
using System.Collections.Generic;
using System.Linq;
using Klimatogrammen.Models.Domain;
namespace Klimatogrammen.ViewModels
{
public class VraagViewModel
{
public String Question { get; private set; }
public String Code { get; private set; }
public List<double> Answers { get; private set; }
public VraagViewModel(Parameter temp, Klimatogram klim)
{
Question = temp.Naam;
Code = temp.Code;
Answers = temp.GeefMogelijkeAntwoorden(klim).ToList();
}
}
}
以及相关的视图
@model IEnumerable<Klimatogrammen.ViewModels.VraagViewModel>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Question)
</th>
<th>
@Html.DisplayNameFor(model => model.Answers)
</th>
@Html.DropDownListFor(Model)
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Question)
</td>
<td>
@Html.DropDownListFor(new SelectList(item.Answers))
</td>
</tr>
}
</table>
所以我想要一个双打列表作为问题的答案。每个问题都有自己的特定答案,我想在每个问题旁边显示它们的可能性。
我尝试了一些方法,但找不到解决方案(从选择列表到选择项目等,但我没有值或文本,我只想显示双打)。另外我的观点必须保持IEnumerable
(我有我的理由)
任何人都可以分享一些关于这方面的信息吗?
为此,我建议您将 SelectListItem 的 IEnumerable 传递给 DropDown。因此,向您的模型添加另一个 属性。
...
public double Answer { get; set;}
...
然后将您的双精度集合转换为 SelectListItem 的集合
var collection = Answers.Select(a => new SelectListItem() {Text = a.ToString(), Value = a.ToString()});
然后一旦您使用下面的帮助程序,您将被排序并且您的 Model.Answer 将具有正确的值
@Html.DropDownListFor(model => model.Answer, Model.Answers)
进一步工作
我建议制作一个 Enumerable 扩展,它可以接收一些更复杂的对象,然后为您提供 select 列表
public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable) where T : ISelectList
{
var list = enumerable.ToList();
if (list.Any())
{
return list.Select(l => new SelectListItem() { Text = l.Name, Value = l.Id.ToString() });
// We can use an interface to define that any type that
//has 2 properties (Name and Id) can be converted into a select list.
}
return Enumerable.Empty<SelectListItem>();
}
public interface ISelectList
{
string Name { get; set; }
int Id { get; set; }
}
如果你下次想要一个很棒的衬垫,你可以使用这个:
var list = new SelectList(Answers.Select(x=>new KeyValuePair<string,string>(x.ToString(),x.ToString())), "Key", "Value");
实际上我自己(和我的一个朋友)修好了。
这是我目前的观点:
@model IEnumerable<Klimatogrammen.ViewModels.VraagViewModel>
@{
Layout = null;
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
@using (Html.BeginForm("Vraag", "Vraag"))
{
@Html.ValidationSummary(true)
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Vraag)
</th>
<th>
@Html.DisplayNameFor(model => model.Antwoorden)
</th>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Vraag)
</td>
<td>
@Html.DropDownListFor(p => item.Antwoord, item.test, "--- Kies een antwoord ---")
@Html.ValidationMessageFor(m => item.Antwoord)
</td>
</tr>
}
</table>
<div style="text-align:center;"><input type="submit" value="Controleer uw vragen" class="btn btn-default" /></div>
}
item.test
包含 SelectListItem
的列表,它们是在我的模型中制作的。
这样我就得到了我的下拉框!感谢大家的帮助 ;)
现在剩下的唯一问题是我的验证消息,如果我不填写任何内容,我会收到一条消息,要求我为每个框输入一些内容。但是当我填写 1 时,当我点击我的按钮时,我会被转发。 (如果我找到一个选项,我也会在这里添加)
我正在做一个学校项目,但在我看来我被困在一个下拉列表中。所以这是我的 ViewModel:
using System;
using System.Collections.Generic;
using System.Linq;
using Klimatogrammen.Models.Domain;
namespace Klimatogrammen.ViewModels
{
public class VraagViewModel
{
public String Question { get; private set; }
public String Code { get; private set; }
public List<double> Answers { get; private set; }
public VraagViewModel(Parameter temp, Klimatogram klim)
{
Question = temp.Naam;
Code = temp.Code;
Answers = temp.GeefMogelijkeAntwoorden(klim).ToList();
}
}
}
以及相关的视图
@model IEnumerable<Klimatogrammen.ViewModels.VraagViewModel>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Question)
</th>
<th>
@Html.DisplayNameFor(model => model.Answers)
</th>
@Html.DropDownListFor(Model)
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Question)
</td>
<td>
@Html.DropDownListFor(new SelectList(item.Answers))
</td>
</tr>
}
</table>
所以我想要一个双打列表作为问题的答案。每个问题都有自己的特定答案,我想在每个问题旁边显示它们的可能性。
我尝试了一些方法,但找不到解决方案(从选择列表到选择项目等,但我没有值或文本,我只想显示双打)。另外我的观点必须保持IEnumerable
(我有我的理由)
任何人都可以分享一些关于这方面的信息吗?
为此,我建议您将 SelectListItem 的 IEnumerable 传递给 DropDown。因此,向您的模型添加另一个 属性。
...
public double Answer { get; set;}
...
然后将您的双精度集合转换为 SelectListItem 的集合
var collection = Answers.Select(a => new SelectListItem() {Text = a.ToString(), Value = a.ToString()});
然后一旦您使用下面的帮助程序,您将被排序并且您的 Model.Answer 将具有正确的值
@Html.DropDownListFor(model => model.Answer, Model.Answers)
进一步工作
我建议制作一个 Enumerable 扩展,它可以接收一些更复杂的对象,然后为您提供 select 列表
public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable) where T : ISelectList
{
var list = enumerable.ToList();
if (list.Any())
{
return list.Select(l => new SelectListItem() { Text = l.Name, Value = l.Id.ToString() });
// We can use an interface to define that any type that
//has 2 properties (Name and Id) can be converted into a select list.
}
return Enumerable.Empty<SelectListItem>();
}
public interface ISelectList
{
string Name { get; set; }
int Id { get; set; }
}
如果你下次想要一个很棒的衬垫,你可以使用这个:
var list = new SelectList(Answers.Select(x=>new KeyValuePair<string,string>(x.ToString(),x.ToString())), "Key", "Value");
实际上我自己(和我的一个朋友)修好了。
这是我目前的观点:
@model IEnumerable<Klimatogrammen.ViewModels.VraagViewModel>
@{
Layout = null;
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
@using (Html.BeginForm("Vraag", "Vraag"))
{
@Html.ValidationSummary(true)
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Vraag)
</th>
<th>
@Html.DisplayNameFor(model => model.Antwoorden)
</th>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Vraag)
</td>
<td>
@Html.DropDownListFor(p => item.Antwoord, item.test, "--- Kies een antwoord ---")
@Html.ValidationMessageFor(m => item.Antwoord)
</td>
</tr>
}
</table>
<div style="text-align:center;"><input type="submit" value="Controleer uw vragen" class="btn btn-default" /></div>
}
item.test
包含 SelectListItem
的列表,它们是在我的模型中制作的。
这样我就得到了我的下拉框!感谢大家的帮助 ;)
现在剩下的唯一问题是我的验证消息,如果我不填写任何内容,我会收到一条消息,要求我为每个框输入一些内容。但是当我填写 1 时,当我点击我的按钮时,我会被转发。 (如果我找到一个选项,我也会在这里添加)