【问题标题】:Generate a List on viewmodel在视图模型上生成列表
【发布时间】:2015-05-28 06:33:29
【问题描述】:

我想生成列表并绑定到视图模型中,但我在下面出现错误,我是否定义了错误的属性?

传入字典的模型项是类型 'SurveyTool.Models.AnswerQuestionViewModel',但是这本词典 需要类型的模型项 'System.Collections.Generic.IEnumerable`1[SurveyTool.Models.AnswerQuestionViewModel]'。

编辑.cshtml:

@model IEnumerable<SurveyTool.Models.AnswerQuestionViewModel>

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<table>


@foreach (var item in Model) {
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.Question)
        </td>
        <td>
            @Html.EditorFor(modelItem => item.Answer)
        </td>
    </tr>
}

</table>

SURV_AnswerController:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SurveyTool.Models;

namespace SurveyTool.Controllers
{
    public class SURV_AnswerController : Controller
    {
        private SurveyToolDB db = new SurveyToolDB();
        //
        // GET: /SURV_Answer/

        public ActionResult Edit(int Survey_ID)
        {
            AnswerQuestionViewModel viewmodel = new AnswerQuestionViewModel();

            var query = from r in db.SURV_Question_Ext_Model
                        join s in db.SURV_Question_Model
                        on r.Qext_Question_ID equals
                        s.Question_ID
                        where s.Question_Survey_ID == Survey_ID
                        orderby s.Question_Position ascending
                        select r;

            foreach(var item in query)
            {

                viewmodel.Question = item.Qext_Text;
            }

            return View(viewmodel);
        }

    }
}

AnswerQuestionViewModel:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace SurveyTool.Models
{
    public class AnswerQuestionViewModel
    {
        public string Answer { get; set; }
        public string Question { get; set; }
    }
}

【问题讨论】:

  • 您只传递一个对象来查看视图期望集合的位置。
  • 此外,您会在循环期间覆盖 viewmodel.Questions 中的值。代码逻辑有问题。再想一想——你想把什么传递给视图。看起来你想传递一个数组。然后在一个动作中生成一个数组,而不是单个对象。

标签: c# linq list asp.net-mvc-4 razor


【解决方案1】:

您只返回一个AnswerQuestionViewModel 项目,而不是一个集合。在您的 public ActionResult Edit(int Survey_ID) 方法中,更改

AnswerQuestionViewModel viewmodel = new AnswerQuestionViewModel();

List<AnswerQuestionViewModel> viewmodel = new List<AnswerQuestionViewModel>();

然后在foreach循环中

foreach(var item in query)
{
    viewmodel.Add(new AnswerQuestionViewModel() { Question = item.Qext_Text });
}
return View(viewmodel);

编辑

请注意,您的视图也存在问题。您使用foreach 循环会生成重复的name 属性,因此集合不会在回发时绑定。由于重复的id 属性,它还会生成无效的html。您需要为 typeof AnswerQuestionViewModel 使用自定义 EditorTemplatefor 循环。使用for 循环,它需要是

@model List<SurveyTool.Models.AnswerQuestionViewModel>
@using (Html.BeginForm())
{
    for(int i = 0; i < Model.Count; i++)
    {
        @Html.DisplayFor(m => m[i].Question)
        @Html.EditorFor(m => m[i].Answer)
    }
    <input type="submit" />
}

但是,这只会回发您模型的 Answer 属性。您没有任何标识问题 ID 的属性,因此您可能需要该 ID 的附加属性,并在视图中为其添加隐藏输入

【讨论】:

  • 这是否需要在视图中将模型 IEnumerable 更改为模型 List
  • 是的,但这只是因为它们是视图的其他问题(由于重复的name 属性,它不会回发,而且由于重复的id 属性,它的 html 也是无效的。我会很快用额外的信息更新我的答案
  • 再次感谢斯蒂芬,经过一段时间的锻炼,这就是我真正想要的。非常感谢您的及时指导:')会继续学习!
  • 另见更新 - 您需要更正视图代码,否则发布时绑定会失败
  • 非常有用且清晰的信息!现在正在努力!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2014-01-21
  • 1970-01-01
  • 2022-07-23
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多