递增和递减查询字符串参数?

时间:2016-02-12 10:43:17

标签: c# asp.net-mvc query-string

在我目前的MVC项目中(我在同一个项目中提出的第三个问题!),我有一个“登陆页面”。只需单击一个按钮,就会重定向到以下页面URL:

本地主机:111111 / AccountsFinance /索引questionId = 1

我可以手动编辑网址并更改 Id = 2 ,这会更改显示的内容,但我需要一个按钮来执行此操作。

在此视图中,我有以下内容:

@using (Html.BeginForm("Index", "AccountsFinance", FormMethod.Post))
{
    //SOME CODE

    <input class="btn btn-success" type="submit" value="Back" />
    <input class="btn btn-success" type="submit" value="Next" />
}

这是我的控制器代码,不确定是否有必要提出这个问题,但最好不要包含它而不是!

    public AccountsFinanceQuestion afqList = new AccountsFinanceQuestion();

    public ActionResult Index(string ans)
    {
        int qId = int.Parse(Request.QueryString["questionId"]);

        using (S3WEntities1 ent = new S3WEntities1())
        {
            afqList.Question = ent.Questions.Where(w => w.QuQuestionId == qId).Select(s => s.QuQuestion).FirstOrDefault().ToString();
            afqList.Answers = ent.Answers.Where(w => w.AnsQuestionId == qId).Select(s => s.AnsAnswer).ToList();
        }

        return View("Index", afqList);
    }

那么我如何递增/递减查询字符串的 questionId = X 部分,以便它继续前进到下一个问题/上一个问题。对于同一控制器上的相同方法,这都是相同的视图。我也明白,对于第一个问题,如果用户点击回来,这可能不会很好,因为URL完全不同,但这是以后要发生的事情。

2 个答案:

答案 0 :(得分:2)

首先,您不需要手动解析查询字符串参数 - 默认绑定器将为您执行此操作。只需使用相应的名称定义方法参数。 E.g。

public ActionResult Index(int questionId)

其次,您似乎正在审核某些问题的详细信息。所以我不认为指数是适当的行动。我建议使用详细信息或编辑:

public ActionResult Details(int questionId)

关于下一个和上一个问题的链接 - 您只需在视图中生成操作链接:

@Html.ActionLink("Back", "Details", new { questionId = Model.QuQuestionId - 1 }
@Html.ActionLink("Next", "Details", new { questionId = Model.QuQuestionId + 1 })

另请注意,您的方法有几个问题:

  • 如果某个问题被删除并且ID不再是增量,该怎么办?
  • 如果当前问题的id = 1,即第一个问题怎么办?它不应该链接到上一个问题
  • 如果最近的问题是最后一个怎么办?

解决这些问题的最简单方法 - 将上一个和下一个问题的ID传递给您的视图。您可以使用模型属性,也可以使用ViewBag

ViewBag.PrevQuestionId = ent.Questions
    .Where(q => q.QuQuestionId < questionId)
    .OrderByDescending(q => q.QuQuestionId)
    .Select(q => q.QuQuestionId)
    .FirstOrDefault();

然后在View中,您可以有条件地添加上一个问题的链接:

 @if (ViewBag.PrevQuestionId > 0) {
      @Html.ActionLink("Back", "Details", new { questionId = ViewBag.PrevQuestionId }
 }

与下一个问题相同

答案 1 :(得分:-1)

您可以在控制器中执行以下操作:

int qId = int.Parse(Request.QueryString["questionId"]);
Response.RedirectToRoute("current-route?questionId=" + qId++);