【问题标题】:Dropdownlistfor MVC 5 in ListView (IEnumerable of Viewmodel)ListView 中 MVC 5 的下拉列表(Viewmodel 的 IEnumerable)
【发布时间】:2015-03-09 14:54:29
【问题描述】:

我正在做一个学校项目,但在我看来,我被困在一个下拉列表中。所以这是我的 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();
        }

    }
}

以及相关的View

@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(我有我的理由)

任何人都可以分享一些关于这方面的信息吗?

【问题讨论】:

  • 你的视图需要是List&lt;T&gt;
  • 什么意思? IEnumerable&lt;ViewModel&gt; ?

标签: c# asp.net asp.net-mvc view viewmodel


【解决方案1】:

为了做到这一点,我建议您将 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 扩展,它可以接收一些更复杂的对象,然后给你选择列表

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");

【讨论】:

    【解决方案2】:

    我实际上能够自己修复它(和我的一个朋友)。

    这是我目前的观点:

    @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 时,我会在单击按钮时被转发。 (如果我找到了一个选项,我也会在这里添加)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多