与 Julian 类似的情况: MVC - Route with querystring
我无法掌握如何使用 GET 请求、定义的路由和表单中的值来操作表单。
(编辑:在问题方面与 Julian 的问题基本相同,但在 javascript 库和/或自定义路由方面询问具体解决方案(而不是一般区域并解释为什么存在问题和给定代码所需的不同方法) ; 也没有使用global.asax ; 一年多以来的问题意味着其他选项也可能可用。)
作为一个初学者,很难使用大量的客户端库,并且几乎不知道从哪里开始使用相关的自定义路由提供程序,但是对于保持服务器端路由和 301 重定向的简单性来说,这似乎更可取。
尝试了不同的路线(显然不是“自定义”)并查看了许多库,但确实没有取得任何切实的进展。
任何简单的指针,例如路由示例/关键字/链接,简单的客户端代码示例(对于此上下文等)都将非常有用。
使用本教程按标题和类型创建电影搜索页面。]
这是我的具体代码:
路由配置:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Movies",
url: "{controller}/{action}/{title}/{genre}",
defaults: new
{
controller = "Home",
action = "Index"
}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
行动结果:
public ActionResult SearchIndex(string title, string genre)
{
var genreQuery = from g in db.Movies
orderby g.Genre
select g.Genre;
var genres = new List<string>();
genres.AddRange(genreQuery.Distinct());
ViewBag.Genre = new SelectList(genres);
var movies = from m in db.Movies
select m;
if (!string.IsNullOrEmpty(title))
{
movies = movies.Where(s => s.Title.Contains(title));
}
if (!string.IsNullOrEmpty(genre))
{
movies = movies.Where(s => s.Genre == genre);
}
return View(movies);
}
搜索索引.cshtml:
@model IEnumerable<DefaultMvcIA.Models.Movie>
@{
ViewBag.Title = "SearchIndex";
}
<h2>SearchIndex</h2>
<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("SearchIndex", "Movies", FormMethod.Get))
{
<p>Genre: @Html.DropDownList("Genre", "All")
Title: @Html.TextBox("Title")<br />
<input type="submit" value="Filter" /></p>
}
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.MovieID }) |
@Html.ActionLink("Details", "Details", new { id=item.MovieID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.MovieID })
</td>
</tr>
}
</table>
问题 GET 请求浏览器只使用查询字符串,而不是在 RouteConfig 中设置路由(可以理解)。需要编写自定义路由以将这些查询字符串重定向到路由或使用客户端库。具体信息真的很有用,因为那里有许多不同的路由库,不知道从哪里开始(首选)301 自定义路由方法。