【问题标题】:Incrementing and Decrementing a querystring parameter?增加和减少查询字符串参数?
【发布时间】:2016-02-12 10:43:17
【问题描述】:

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

localhost:111111/AccountsFinance/Index?questionId=1

我可以手动编辑 URL 并更改 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 是完全不同的,但这是以后要讨论的问题。

【问题讨论】:

  • 你的问题不是我不清楚。您是否在查询中要求qID+1

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


【解决方案1】:

首先,您不需要手动解析查询字符串参数 - 默认绑定程序会为您完成。只需定义具有相应名称的方法参数即可。例如

public ActionResult Index(int questionId)

其次,您似乎正在查看某个问题的详细信息。所以我不认为Index 是合适的行动。我建议使用详细信息或编辑:

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 }
 }

与下一个问题相同

【讨论】:

    【解决方案2】:

    你可以在你的控制器中做这样的事情:

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

    【讨论】:

    • 您不必访问或解析查询字符串。 MVC 动作应该简单地接受一个 int。
    • 相信我,如果你使用底层的 Request 对象,你做错了。 MVC 模式中控制器的全部意义在于从等式中抽象出底层基础对象。例如,您将如何对上述内容进行单元测试?!
    • 您的响应重定向也是错误的。您希望从操作返回结果,而不是(再次)与底层对象交互。这几乎就是 1999 年经典 asp 的工作方式。现在事情已经发生了变化。
    • 我,不是在谈论最佳实践。我只是想帮助问题的作者使他的代码正常工作:)
    • 我不是在谈论最佳实践,我是在谈论 MVC 的基础知识。对不起,这个答案是错误的(句号)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2020-10-06
    相关资源
    最近更新 更多