gpt4 book ai didi

c# - 如何从保存的数据在 ASP.NET MVC 中重建 URL/路由?

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:53 25 4
gpt4 key购买 nike

我对 ASP.NET MVC 框架及其管道的不熟悉使我来到这里,我感谢任何人耐心阅读和考虑我的问题!

好的,场景是这样的:我有一个应用程序,它有许多带有网格的页面,这些页面显示基于搜索的数据,从其他数据中向下钻取,基于上下文特定数据的报告(即它们在 Foo 的详细信息页面上,然后单击显示与 Foo 相关的数据表的链接,等等。

从遍布应用程序的所有这些页面,用户可以通过给它一个名称和描述来保存“报告”或网格。这并没有真正保存显示在网格中的数据,而是保存了定义网格外观的参数,保存了用于获取数据的参数,并保存了参数定义它们在应用程序中的“位置”(操作、 Controller 、路由)——基本上是一堆关于报告/网格以及如何构建它的元数据。

所有这些保存的报告都在一个列表中可用,在应用程序的特定页面上显示名称和描述,每个链接到一个通用 URL,例如“/Reports/Saved/248”(其中 248 是报告 ID 的示例)。

这是我需要帮助的部分:

当我通过 url“/Reports/Saved/248”访问操作并将元数据从该特定报告的数据库中拉出时,我如何才能将该数据和请求重定向到相同的操作、 Controller 和路由用于显示最初保存报表的 View ?本质上,我希望用户在同一 View 中查看报告,使用与保存报告时相同的 URL。如果可能的话,我最好能够基本上“调用”相同的操作,就好像我正在进行方法调用一样。


更新:不幸的是,我们的报告页面(即这些网格出现的页面)没有使用 RESTful URLs - 例如,我们有一个我们称之为高级搜索页面的页面,它需要相当多的潜在参数(将近 30 ) 来自包含选择列表、文本框等的表单。当用户提交该页面时,我们对一个接受模型 Binder 为我们构建的复杂类型的操作执行 POST - 我想调用的是相同的操作当用户从数据库中选择保存的高级搜索时。这个例子集中体现了我的问题。

谢谢

最佳答案

我认为您会希望使用带有采用 RouteValueDictionary 的签名的 RedirectToAction。您要重定向到的方法需要能够从 Controller 上的 ValueProvider 中提取值。它可能看起来像:

public ActionResult Saved( int id )
{
var reportParams = db.Reports.SingleOrDefault( r => r.ID == id );
if (reportParams == null)
...handle error...

var routeValues = ParamsToRouteValueDictionary( reportParams );

return RedirectToAction( reportParams.Action, reportParams.Controller, routeValues );
}

private RouteValueDictionary ParamsToRouteValueDictionary( object parameters )
{
var values = new RouteValueDictionary();
var properties = parameters.GetType().GetProperties()
.Where( p => p.Name != "Action" && p.Name != "Controller" );
foreach (var prop in properties)
{
values.Add( prop.Name, prop.GetValue(parameters,null) );
}

return values;
}

编辑

实际上,使用过滤器模型作为方法的参数可能会更容易。您只需要操作的 GET 和 POST 版本。

 [ActionName("People")]
[AcceptVerbs( HttpVerbs.Get )]
public ActionResult PeopleDisplay( SearchModel filter )
{
return People( filter );
}

[AcceptVerbs( HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult People( SearchModel filter )
{
....
}

然后您将在您的数据库中为报告存储过滤器参数(按名称)、操作(“人员”)和 Controller 。重定向结果将使用 GET 并被定向到 PeopleDisplay 方法,而后者又简单地使用正确的参数调用 People 方法。从表单发帖直接调用 People 方法。使用两种方法可以让您使用 CSRF 预防机制。您可以在 TempData 中使用标志来确保 GET 操作仅在您希望限制对它的访问时通过重定向机制调用。

结束编辑

另一种选择是简单地存储所使用的 View ,而不是进行重定向,只呈现适当的 View 。您需要考虑的一件事是,执行重定向将以包含所有参数的 URL 结束,而呈现 View 将单独保留 URL,只显示与创建报告时使用的 URL 相同的 View .

关于c# - 如何从保存的数据在 ASP.NET MVC 中重建 URL/路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com