gpt4 book ai didi

asp.net-mvc - 用于搜索的ASP.NET MVC自定义路由

转载 作者:行者123 更新时间:2023-12-03 08:51:48 25 4
gpt4 key购买 nike

这是我的情况。对于示例,假设我需要根据搜索条件返回汽车列表。我希望有一个View来显示结果,因为输出将是相同的,但是我需要几种到达那里的方法。例如,我可能有一个带有文本框的表格,可以按年份进行搜索。我可能还有另一个单独的页面,其中包含所有红色丰田汽车的超链接。如何在同一View和Controller中处理这些多个场景。我的困境是搜索中可能包含多个选项……年份,品牌,型号等,但我不知道将它们放在哪里。

最好的方法是什么?我应该在路由中定义参数还是与查询字符串等一起使用?

最佳答案

选项1

当然,您总是可以选择/ car / search /?vendor = Toyota&color = Red&model = Corola的方式,我认为这对您会有所帮助。

routes.MapRoute(
"CarSearch",
"car/search",
new { controller = "car", action = "search" }
);

在这种情况下,您可以从Request.Params获取参数。

选项2

或者,您可以在路由表中定义参数,但是AFAIK要求为所有可能的组合制定一套规则,因为参数的顺序很重要,例如:
        routes.MapRoute(
"CarSearch1",
"car/search/vendor/{vendor}/color/{color}/model/{model}",
new {controller = "car", action = "search"}
);

routes.MapRoute(
"CarSearch2",
"car/search/color/{color}/vendor/{vendor}/model/{model}",
new {controller = "car", action = "search"}
);

routes.MapRoute(
"CarSearch3",
"car/search/model/{model}/color/{color}/vendor/{vendor}",
new {controller = "car", action = "search"}
);

...等等。如果要使用标准MvcRouteHandler,则为true。

但这是一个简单的方法:)

选项3

我认为,最艰难但最优雅的方法是制作自己的IRouteHandler实现-它可以按照参数顺序提供更大的灵活性。但是同样,这是一个艰难的方法,如果您有简单的应用程序,则不要使用它。
因此,仅以如何实现这种方式为例(非常简单的示例):

将新路线添加到路线列表:
routes.Add
(
new Route
(
"car/search/{*data}",
new RouteValueDictionary(new {controller = "car", action = "search", data = ""}),
new MyRouteHandler()
)
);

添加将调整标准请求处理链的类:
class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler(requestContext);
}
}

class MyHttpHandler : MvcHandler
{
public MyHttpHandler(RequestContext requestContext) : base(requestContext)
{
}

protected override void ProcessRequest(HttpContextBase httpContext)
{
IController controller = new CarController();
(controller as Controller).ActionInvoker = new MyActionInvoker();
controller.Execute(RequestContext);
}
}

class MyActionInvoker : ControllerActionInvoker
{
protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> parameters)
{
// if form of model/{model}/color/{color}/vendor/{vendor}
var data = ControllerContext.RouteData.GetRequiredString("data");
var tokens = data.Split('/');

var searchParams = new Dictionary<string, string>();
for (var i = 0; i < tokens.Length; i++)
{
searchParams.Add(tokens[i], tokens[++i]);
}

parameters["searchParams"] = searchParams;

return base.InvokeActionMethod(methodInfo, parameters);
}
}

在 Controller 中:
public ActionResult Search(IDictionary<string, string> searchParams)
{
ViewData.Add
(
// output 'model = Corola, color = red, vendor = Toyota'
"SearchParams",
string.Join(", ", searchParams.Select(pair => pair.Key + " = " + pair.Value).ToArray())
);
return View();
}

它将与任何搜索参数顺序一起使用:
/car/search/vendor/Toyota/color/red/model/Corola
/car/search/color/red/model/Corola/vendor/Toyota
/car/search/model/Corola/color/red/vendor/Toyota

但也不要忘记制作链接生成逻辑,因为Html.ActionLink和Html.RenderLink不会以/ car / search / model / Corola / color / red / vendor / Toyota的漂亮形式为您提供url,因此您需要制作自定义链接生成器。

因此,如果您需要真正灵活的路由-最好采用这种困难的方法:)

关于asp.net-mvc - 用于搜索的ASP.NET MVC自定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/379558/

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