【问题标题】:Trying to use 2 models in the one cshtml(MVC 4) but getting a dictionary error尝试在一个 cshtml(MVC 4) 中使用 2 个模型,但出现字典错误
【发布时间】:2014-04-09 13:38:14
【问题描述】:

基本上我必须在一个类文件中为我的类创建一个 ParentView,因为我试图在一个 cshtml 文件中使用这两个类。

@model JavaTutorial.Models.ParentView
@{
    ViewBag.Quiz = "Details";
}

<h2>Details</h2>

<h2>Quiz: @Model.Quiz.Title</h2>

@if (Model.Quiz.Title == "IF Statements")
{

    <h2>Quiz 24</h2>
using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Evaluation.Questions)
    <input type="submit" />
}

问题是当我运行它时,我现在得到以下信息:

“/”应用程序中的服务器错误。

传入字典的模型项是类型 'JavaTutorial.Models.Quiz',但是这个字典需要一个模型项 'JavaTutorial.Models.ParentView' 类型。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.InvalidOperationException:模型项 传入字典的类型是“JavaTutorial.Models.Quiz”,但是 这个字典需要一个类型的模型项 'JavaTutorial.Models.ParentView'。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

我希望在单击“IF 语句”链接时调用我的评估方法。也许有更简单的方法来做到这一点?

控制器:

            public ActionResult Details(int id)
        {
            var quiz = storeDB.Quizzes.Find(id);
            return View(quiz);
        }


        public ActionResult Test()
        {
            var evalVM = new Evaluation();

            //the below is hardcoded for DEMO. you may get the data from some  
            //other place and set the questions and answers

            var q1 = new Question { ID = 1, QuestionText = "What is your favourite language" };
            q1.Answers.Add(new Answer { ID = 12, AnswerText = "PHP" });
            q1.Answers.Add(new Answer { ID = 13, AnswerText = "ASP.NET" });
            q1.Answers.Add(new Answer { ID = 14, AnswerText = "Java" });
            evalVM.Questions.Add(q1);

            var q2 = new Question { ID = 2, QuestionText = "What is your favourite DB" };
            q2.Answers.Add(new Answer { ID = 16, AnswerText = "SQL Server" });
            q2.Answers.Add(new Answer { ID = 17, AnswerText = "MySQL" });
            q2.Answers.Add(new Answer { ID = 18, AnswerText = "Oracle" });
            evalVM.Questions.Add(q2);

            return View(evalVM);           
        }

        [HttpPost]
        public ActionResult Test(Evaluation model)
        {
            if (ModelState.IsValid)
            {
                foreach (var q in model.Questions)
                {
                    var qId = q.ID;
                    var selectedAnswer = q.SelectedAnswer;
                    // Save the data 

                }
                return RedirectToAction("ThankYou"); //PRG Pattern
            }
            //reload questions
            return View(model);
        }

课堂测验.cs

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

namespace JavaTutorial.Models
{
    public class Quiz
    {
        [Key]
        public int QuizId { get; set; }
        public string Title { get; set; }
        public int difficulty { get; set; }
        public string description { get; set; }
        public Genre Genre { get; set; }
    }

    public class Question
    {
        public int ID { set; get; }
        public string QuestionText { set; get; }
        public List<Answer> Answers { set; get; }
        [Required]
        public string SelectedAnswer { set; get; }
        public Question()
        {
            Answers = new List<Answer>();
        }
    }
    public class Answer
    {
        public int ID { set; get; }
        public string AnswerText { set; get; }
    }
    public class Evaluation
    {
        public List<Question> Questions { set; get; }
        public Evaluation()
        {
            Questions = new List<Question>();
        }
    }

    public class ParentView
    {
        public Quiz Quiz { get; set; }
        public Question Question { get; set; }
        public Answer Answer { get; set; }
        public Evaluation Evaluation{ get; set; }

    }

}

【问题讨论】:

  • 我们可以看看您的控制器操作代码吗?
  • @Oliver 在其中添加。只是在控制器上,细节处理测验类,然后测试与评估/问题/答案类一起工作。
  • @user3055450 使用视图模型将 2 个模型合并为一个。然后在视图中调用该视图模型

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


【解决方案1】:

在你的第一行

@model JavaTutorial.Models.ParentView

您将模型声明为ParentView。如果您想在模型中同时包含这两个类,则需要创建包含这两个类的第三个类。 Tuple&lt;ParentView, Quiz&gt; 将起作用,或者只是您自己的实现:

public class ParentAndQuiz
{
    public ParentView  parentView {get; set;
    public Quiz quiz { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2012-10-12
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多