在Razor MVC视图的URL中包含搜索字符串

时间:2015-06-19 13:19:36

标签: c# asp.net-mvc razor

我正在尝试将搜索字符串(例如http://stackoverflow.com?this=that)添加到控制器返回的视图中。 JS在我无法更改的页面上使用它,因此其他传输数据的方法不是一种选择。

目前我只是从我的控制器返回View("Page", viewModel);,这似乎不允许您通过网址传递任何内容。

我尝试使用return RedirectToAction("a", "b", new { this = that });,但我无法弄清楚如何使用视图模型和URL字符串正确返回视图。

如何在返回的视图中添加?a=b样式字符串?

2 个答案:

答案 0 :(得分:4)

视图没有查询字符串参数,请求没有。所以如果这是你的控制器动作:

public ActionResult SomeAction()
{
    return View();
}

然后,对SomeAction提出的任何请求都需要具有该查询字符串参数:

http://hostname/Widgets/SomeAction?something=somevalue

行动可以接受它作为参数:

public ActionResult SomeAction(string something)

但如果服务器端代码不对该值执行任何操作,则

如果无法修改对SomeAction的请求,那么您需要将其拆分为两个操作。第一个只是重定向到第二个:

public ActionResult SomeAction()
{
    return RedirectToAction("Widgets", "SomeOtherAction", new { something = somevalue });
}

public ActionResult SomeOtherAction()
{
    return View();
}

在该场景中,第一个操作的唯一责任是将用户转发到具有特定路由参数的第二个操作。这是必要的,因为查询字符串需要位于浏览器的请求中,而不是来自服务器的响应。因此,第一个操作的响应是指示浏览器使用查询字符串发出新请求。

答案 1 :(得分:2)

  

我正在尝试将[查询字符串参数]添加到控制器返回的视图的[URL]。

你做不到。呈现视图以响应对某个URL的请求。该请求已由浏览器在该点上进行,因此从逻辑上讲,您无法再更改URL。

可以做的是重定向。

  

我尝试使用return RedirectToAction("a", "b", new { this = that });,但我无法确定如何使用视图模型和网址字符串正确返回视图。

我认为您尝试解决的问题是,您的Page操作会构建一些模型,您希望在重定向后再次从SeachResults页面访问该模型。

为此,您可以在重定向之前在TempData中设置模型。见Using Tempdata in ASP.NET MVC - Best practice。适合您的场景:

public ActionResult Page()
{
    var tempModel = new FooModel
    {
        Foo = "Bar"
    };

    TempData["TempModel"] = tempModel;

    return RedirectToAction("SeachResults" new { searchParameters = "baz" });
}

public ActionResult SeachResults(string searchParameters)
{
    var model = TempData["TempModel"] as FooModel;

    return View(model);
}