【问题标题】:MVC3 URL alternativesMVC3 URL 替代品
【发布时间】:2012-06-26 22:40:21
【问题描述】:

在查看了很多问题和 Internet 数据后,我已经解决了我的一个问题,即正确从 MVC3 应用程序获取 URL 参数。 问题是编码没有错误,但在路由方面(我对路由不太擅长......)。 这是当前的问题。

http://localhost:51561/Report/Details/1

这是我的应用程序呈现报告详细信息的方式,这很好。但是当它这样做时,我无法从 URL 参数中获取值,就像这样

Request.QueryString["id"]

但是,当我手动输入 URL http://localhost:51561/Report/Details?id=1 时,它可以工作... 事情是我喜欢第一个 URL 类型,但我不知道如何从中获取参数...

请帮忙...

更新:

我的控制器操作:

public ViewResult Details(int id)
    {
        Report report = db.Reports.Find(id);
        ViewBag.TestID = Request.QueryString["id"].ToString();
        return View(report);
    }

    public ActionResult Show(int id)
    {
        Report report = db.Reports.Find(id);
        var imageData = report.Image;
        return (File(imageData, "image/jpg"));
    }

我的观点:

<div class="display-label">Picture</div>
<div class="display-field">
   <img alt="image" src="<%=Url.Action("Show", "Report", new { id = ViewBag.TestID })%>" width="200px" />
</div>

【问题讨论】:

  • 我觉得你的action方法还可以,只是去掉querystring部分。您已经将 id 作为参数传递了

标签: asp.net-mvc url-rewriting url-routing


【解决方案1】:

你不应该在 MVC 中使用 Request.QueryString["id"]

只需将id 参数添加到您的ReportController.Details 操作:

public ActionResult Details (int id)

以上假设您在 Global.asax 中设置了默认路由:

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

【讨论】:

  • 你可以说不推荐,但你仍然可以在你的url中使用querystring
  • 是的,你也可以这样做Response.Write,但你也不应该这样做......
【解决方案2】:

首先,您不应该在您的应用程序中使用Request.QueryString。除此之外,在第一个 URL 中,您没有查询字符串,因此您无法访问它(另请参阅 msdn 上的 this article Request.QueryString)。

我还想建议您阅读 ASP.NET MVC3 的基础教程,可以在 here 找到。像你的问题这样的许多事情都在那里得到了彻底的解释。

现在回答您的问题,在您的第一个 URL 示例中,URL 中的 1 是您的操作(详细信息操作)的参数。您必须将此参数添加到您的方法(操作)中:

public ActionResult Details(int id)

更新: 你显然有正确的行动(方法)声明。现在,您可以只使用参数id。因此,只需通过变量(参数)id 更改 Request.QueryString["id"]

public ViewResult Details(int id)
{
    Report report = db.Reports.Find(id);
    ViewBag.TestID = id;
    return View(report);
}

没有必要在 id 上应用ToString(),你不应该在不需要的时候使用它(你可能在其他地方需要它,稍后左右)。只需将其作为原始类型放入ViewBag即可。

您的Show() 方法很好:)。您现在拥有所需的 id 参数。 (尽量避免过多的括号,它看起来很乱,现在又很清楚。)

public ActionResult Show(int id)
{
    Report report = db.Reports.Find(id);
    var imageData = report.Image;
    return File(imageData, "image/jpg");
}

【讨论】:

  • 我已经这样做了,并且我已经完成了几个基础教程。您能否检查更新的问题。我想避免一遍又一遍地阅读教程,因此将不胜感激任何将 ID 用于我的 Show 操作的替代方法。
  • 哦。愚蠢的我...非常感谢...这是我编写许多不同内容的第 13 个小时,我过热了...
  • 其实在修改Details Method后编译运行正常。我现在将更多地研究 Show 方法。再次感谢。
  • 不客气。有时休息片刻,清理头脑并处理发生的一切是件好事。然后你可以从一个清醒的头脑开始;)。
  • 好吧,Show 确实应该可以工作,控制器类中有一个File() 方法(我不知道所有方法:P)。您应该像以前一样使用File() 方法。
猜你喜欢
  • 2012-01-09
  • 2012-08-08
  • 1970-01-01
  • 2014-04-29
  • 2011-06-10
  • 2014-04-18
  • 2012-04-08
  • 2012-07-09
  • 2011-03-31
相关资源
最近更新 更多