MVC3 URL替代方案

时间:2012-06-25 16:30:20

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

在回顾了很多问题和互联网数据后,我已经解决了我的问题,正确地从MVC3应用程序获取URL参数。 事情是编码没有错,但在路由中(我对路由不太好......)。 这是当前的问题。

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

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

Request.QueryString["id"]

但是,当我手动输入网址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>

2 个答案:

答案 0 :(得分: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
    );

答案 1 :(得分:1)

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

我还建议您阅读ASP.NET MVC3的基本教程,找到here。很多像你的问题都在那里得到了彻底的解释。

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

public ActionResult Details(int id)

更新: 你显然有正确的行动(方法)声明。现在,您只需使用参数id即可。因此,仅使用变量(参数)Request.QueryString["id"]更改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");
}