剃刀收集

时间:2015-01-29 22:56:03

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

发布收藏时遇到问题。我刚刚开始学习MVC和剃刀。 我正在编写一份小问卷应用程序,我所做的就是填写一个问题列表,让用户回答问题并发布答案。

我在模型Questionaire和QuestionRepository中有两个类,控制器有两个方法,一个用于获取另一个获取帖子数据的问题,我在用文本框填充表单时遇到的问题我正在努力回发集合。

基本上我想要实现的是拉出问题列表,用文本框在UI上填充,将问题列表与控制器的答案一起发送给处理器。

如果有人可以帮助我,我真的很感激。

public class Questionnaire
{
    public string Title {
        get;
        set;
    }
    public IList<string> Questions {
        get;
        set;
    }
    public string Answer {
        get;
        set;
    }
}

public Questionnaire GetQuestionnaire() {
    return new Questionnaire {
    Title = "Geography Questions",
      Questions = new List<string>  
       {
          "What is the capital of Cuba?",
          "What is the capital of France?",
          "What is the capital of Poland?",
          "What is the capital of Germany?"
         }
        };
    }

    public int GetCustomerAnswer() {
        return 0;
    }
}

控制器

public ActionResult Index()
{
  var q = new QuestionRepository().GetQuestionnaire();  
  return View(q);
}

[HttpPost]
public ActionResult GetAnswer(QuestionRepository q) {
   return View();
}

查看

@model Question.Models.Questionnaire
<h2>Question List</h2>
@using(Html.BeginForm("GetAnswer","Home"))
{
  for(int i=0;i< Model.Questions.Count;i++)
  {
    @Html.Label("Question")
    <text>@Model.Questions[i]</text>
    @Html.TextBox(Q => Model.Questions[i])
    <br /> 
  }
  <input type="submit" name="submit" />
}

2 个答案:

答案 0 :(得分:0)

首先,你的模型是错误的,并没有定义问题和相关答案之间的任何关系(你只能为所有问题添加一个答案)。其次,您的视图会将文本框绑定到每个问题,允许用户仅编辑问题而不添加答案。一个简单的例子可能看起来像

查看模型

public class QuestionVM
{
  public int ID { get; set; }
  public string Text { get; set; }
}

public class AnswerVM 
{
  public QuestionVM Question { get; set; }
  public int ID { get; set; }
  public string Text { get; set; }     
}

public class QuestionnaireVM
{
  public int ID { get; set; }
  public string Title { get; set; }
  public List<AnswerVM> Answers { get; set; }
}

控制器

public ActionResult Create(int ID)
{
  QuestionnaireVM model = new QuestionnaireVM();
  // populate the model from the database, but a hard coded example might be
  model.ID = 1;
  model.Title = "Questionaire 1";
  model.Answers = new List<AnswerVM>()
  {
    new AnswerVM()
    {
      Question = new QuestionVM() { ID = 1, Text = "Question 1" }
    },
    new AnswerVM()
    {
      Question = new QuestionVM() { ID = 2, Text = "Question 2" }
    }
  };
  return View(model);
}

[HttpPost]
public ActionResult Create(QuestionnaireVM model)
{
  // save you data and redirect
}

查看

@model QuestionnaireVM
@using(Html.BeginForm())
{
  @Html.DisplayFor(m => m.Title)
  for(int i = 0; i < Model.Answers.Count; i++)
  {
    @Html.HiddenFor(m => m.Answers[i].Question.ID)
    @Html.DisplayFor(m => m.Answers[i].Question.Text)
    @Html.TextBoxFor(m => m.Answers[i].Text)
  }
  <input type="submit" />
}

这将生成一个视图,显示每个问题和相关的文本框以添加答案。当您回发时,模型将包含问卷的ID,以及包含每个问题的ID及其相关答案的集合。

其他几个类似问题的例子herehere

答案 1 :(得分:-2)

如果你想发回一些东西。在[HttpPost]操作中,您需要返回一个模型。目前,您只需返回View(),但不显示任何模型数据。你应该这样做:

[HttpPost]
public ActionResult GetAnswer(QuestionRepository q) {
   var model = new Answer();
   model.answer = q.answer;
   return View(model);
}

您还需要创建模型Answer。

    public class Answer
    {
         public string answer { get; set; }
    }