gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:57 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,这是真的。

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

选项 3

我认为最困难但最优雅的方法是制作您自己的 IRouteHandler 实现 - 它会为您提供更多的参数顺序灵 active 。但同样,这是一条艰难的道路,如果您有一个简单的应用程序,请不要使用它。因此,仅举例说明如何以这种方式进行(非常简单的示例):

将新路由添加到路由列表:

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/6923683/

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