将值从视图传递到MVC中的控制器

时间:2014-12-29 12:08:32

标签: asp.net-mvc asp.net-mvc-4 entity-framework-4

我有一个数据库表,其中包含多个问题行。 因此,当我按下“下一步”时,我会使用此表单从数据库中获取问题。按钮它完美地工作。 但是当我按下'上一页'按钮它将始终转到第一个问题。 我需要这个去上一个问题。 这就是我的表单的样子:

@using (Html.BeginForm("Index", "Exam"))
    {

        @Html.Hidden("qid", Model.ID, new { @id = "id" })
        <table>
            <tr>
                <td>
                    @Model.ID
                </td>
                <td>
                    @Model.QuestionDes
                </td>           
            </tr>
            <tr>
                <td>
                    <p>@Html.RadioButton("Answer1", new { @id = 1 })  @Model.Answer1 </p>
                </td>            
            </tr>
            <tr>
                <td>
                    <p>@Html.RadioButton("Answer2", new { @id = 2 })  @Model.Answer2 </p>
                </td>            
            </tr>
            <tr>
                <td>
                    <p>@Html.RadioButton("Answer3", new { @id = 3 })  @Model.Answer3 </p>
                </td>            
            </tr>
            <tr>
                <td>
                    <p>@Html.RadioButton("Answer4", new { @id = 4 })  @Model.Answer4 </p>
                </td>
            </tr>

        </table>

        <input type="submit" value="Next" />

    }
    @using (Html.BeginForm("PrevIndex", "Exam"))
    {

        @Html.Hidden("qid1", Model.ID, new { @id = "id1" })
        <input value="Prev" type="submit"/>
    }

这是我的控制器的样子:

[HttpGet]
public ActionResult Index()
{
    IQuestionService ser = new QuestionService();
    QuestionLoadDTO q = ser.GetIndividualQuestions(1);
    //ViewBag.question = q;
    return View(q);
}

[HttpPost]
public ActionResult Index(QuestionLoadDTO ques)
{
    int count = 0;
    count = int.Parse(Request["qid"].ToString());
    count++;
    if (count <= 4)
    {
        IQuestionService ser = new QuestionService();
        QuestionLoadDTO q = ser.GetIndividualQuestions(count);
        return View(q);
    }
    return RedirectToAction("Submit");                               

}
public ActionResult PrevIndex(QuestionLoadDTO ques)
{
    int count1 = 0;
    count1 = int.Parse(Request["qid1"].ToString());
    count1--;
    if (count1 < 5 || count1 >= 0)
    {
        IQuestionService ser = new QuestionService();
        QuestionLoadDTO q = ser.GetIndividualQuestions(count1);
        //return View(q);
        return RedirectToActionPermanent("Index",q);
    }
    return RedirectToAction("End");

}
public ActionResult Submit()
{
    return View();
}
public ActionResult End()
{
    return View();
}

这些是我的其他方法:

QuestionLoadDTO IQuestionService.GetIndividualQuestions(int index)
{
    IQuestionData ser = new QuestionRepository();           

    QuestionLoadDTO q = ser.GetIndividualQues(index);

    return q;
}
public QuestionLoadDTO GetIndividualQues(int index)
{
    Context con = new Context();
    Question question = con.Questions.Find(index);//Where(e => e.ID == index).FirstOrDefault();
    QuestionLoadDTO dto = new QuestionLoadDTO()
    {
        ID = question.ID,
        QuestionDes = question.QuestionDes,
        Answer1 = question.Answer1,
        Answer2 = question.Answer2,
        Answer3 = question.Answer3,
        Answer4 = question.Answer4

    };                                
    return dto;
}

有人可以给我一个想法来解决这个问题。提前谢谢!

3 个答案:

答案 0 :(得分:0)

使用PrevIndex更改您的RedirectToActionPermanent,如下所示返回视图,但索引方法不接受模型值。

return RedirectToActionPermanent("Index",q);

并且您的索引方法不接受任何参数

public ActionResult Index()

所以你需要改变

return RedirectToActionPermanent("Index",q);

return View("Index",q);

像这样改变

public ActionResult PrevIndex(QuestionLoadDTO ques)
    {
        int count1 = 0;
        count1 = int.Parse(Request["qid1"].ToString());
        count1--;
        if (count1 < 5 || count1 >= 0)
        {
            IQuestionService ser = new QuestionService();
            QuestionLoadDTO q = ser.GetIndividualQuestions(count1);
            return View("index",q);

        }
        return RedirectToAction("End");

    }

答案 1 :(得分:0)

return RedirectToActionPermanent("Index", q)

不会传递q,因为此方法实际上是客户端重定向。它也会产生GET请求,而你似乎期望调用Index的过载。这也不是一个好主意 - 这个动作对于处理表单帖子是有好处的,让我们保持这样。

我建议进行以下更改:

[HttpGet]
public ActionResult Index(int? qid)
{
    int index = qid == null ? 1 : qid;

    IQuestionService ser = new QuestionService();
    QuestionLoadDTO q = ser.GetIndividualQuestions(index);
    //ViewBag.question = q;
    return View(q);
}

获取索引操作的重载现在需要加载的问题的可选索引。现在,您可以重复使用此操作来显示您想要的任何问题。

public ActionResult PrevIndex(QuestionLoadDTO ques)
{
    int count1 = 0;
    count1 = int.Parse(Request["qid1"].ToString());
    count1--;
    if (count1 < 5 || count1 >= 0)
    {
        return RedirectToAction("Index", count1);
    }
    return RedirectToAction("End");
}

无需在此处检索问题,只需使用适当的问题索引重定向到索引。

答案 2 :(得分:0)

这就是我解决它的方式......

public ActionResult PrevIndex(QuestionLoadDTO ques)
{
     int count1 = 0;
     count1 = int.Parse(Request["qid1"].ToString());
     count1--;
     if (count1 < 5 || count1 >= 0)
     {
          IQuestionService ser = new QuestionService();
          QuestionLoadDTO q = ser.GetIndividualQuestions(count1);
          //return View(q);
          return View("Index",q);
     }
     return RedirectToAction("End");    
}

我只需将返回“RedirectToAction”更改为返回视图(“索引”,q).... 现在,当您按下“上一步”按钮时,它会完全移至上一个问题....