【问题标题】:Routing on GET request with client side使用客户端路由 GET 请求
【发布时间】:2013-06-12 05:48:31
【问题描述】:

这里与朱利安的情况类似: MVC - Route with querystring

我无法掌握如何使用 GET 请求、已定义的路由和表单中的值来操作表单。

(编辑:在问题方面与 Julian 的问题基本相同,但在 javascript 库和/或自定义路由方面询问特定解决方案(而不是一般区域并解释为什么存在问题和需要不同的方法给定的代码);也没有使用 global.asax;超过一年的问题意味着其他选项也可能可用。)

作为初学者,很难在大量的客户端库中走得更远,并且不知道从哪里开始使用相关的自定义路由提供程序,但是对于保持服务器端路由和 301 重定向的简单性来说,这似乎更可取。

尝试了不同的路线(显然不是“自定义”)并查看了许多库,但确实没有取得任何切实的进展。

任何简单的指针,例如路由示例/关键字/链接,简单的客户端代码示例(对于此上下文等)将非常有用。


使用thistutorial创建电影搜索页面,按titlegenre。]

这是我的具体代码:

路由配置

    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
                }
        );
    }

ActionResult

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);
        }

SearchIndex.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 自定义路由方法。

【问题讨论】:

  • 你有sn-ps代码吗?
  • 更多关于downvote的信息表示赞赏。了解类似的问题,但到目前为止还没有找到关于自定义路由和库的答案,而不仅仅是链接和语句。
  • 不清楚您要的是什么。朱利安的问题很具体。你的没有显示任何代码,或者告诉我们你所面临的问题。您要求“与场景相关的客户端库代码”,但我不知道场景是什么。
  • 已编辑问题:希望更清楚它与链接问题密切相关,但只是要求有用的相关 sn-ps/链接作为许多库和许多路由选项,所以基思的两点没有帮助我进步。
  • 请举例说明您收到的带有查询的帖子网址类型以及您希望它做什么。

标签: javascript jquery asp.net-mvc asp.net-mvc-4 url-routing


【解决方案1】:

编辑:晚上 8 点 46 分

控制器/动作,即。 Search/Index 可以根据是否有查询字符串、是否为get请求等重载返回不同的结果。

public ActionResult Index(){} will be hit by host/ControllerName/Index

public ActionResult Index(string searchTerm) will be hit by host/ControllerName/Index?searchTerm=ABC

编辑:上午 9 点 23 分

如果您需要动态更改它发布的操作,则有一些 javascript 库会拦截 get 请求。如果您不介意使用 ajax,您可以随时查看 http://www.malsup.com/jquery/form/ 以拦截表单请求,您可以将链接更改为您想要的任何内容。

编辑:6/16 上午 9:22 在上面的代码中,有一行

@using (Html.BeginForm("SearchIndex", "Movies", FormMethod.Get))

这表示Get请求将对“SearchIndexController”和“Movies”ActionResult执行“Get”请求。

(因此它仍然使用 global.asax 路由中的代码来路由到该控制器/动作) global.asax 中的此路由代码总是用于每个请求。


在响应中进行编辑以专注于如何访问查询字符串(以重新路由路径)

您可以直接绑定到查询字符串。为避免在其他答案上重复文本,请参阅 ASP.NET MVC - Getting QueryString values 了解一些从查询字符串中获取值的方法。

如果您不想直接在 ActionResult 方法签名中绑定到它们,请使用 Request.Querystring 对象来访问查询字符串。即。

 var searchTerm = Request.QueryString["searchTerm"].ToString();
 var sortColumn = Request.QueryString["sortColumn"].ToString();

 var searchTerms = Request.QueryString["searchTerms"].ToString().SplitBy(",")

取决于查询的语法...

要根据查询字符串参数的结果重定向方法,您始终可以返回不同的操作方法,也可以重定向到操作

 ie. return this.Index2( ..param...); 

 RedirectToAction("ActionName", "ControllerName")

...有很多方法可以重定向到您选择的操作。


如何“操作”表单对我来说真的没有意义。

在 mvc 中,一个简单的设置是有一个类似

的表单
@{using(Html.BeginForm("Index","Home",FormMethod.Post)){
  @Html.LabelFor(m => m.Word)
  @Html.TextBoxFor(m => m.Word, new { @Value = Model.Word})
  <input type="submit" value="Submit">
}

其中“Index”是动作名称,“Home”是控制器名称。这将被路由到 HomeController 的 Action 方法。这个路由路径其实可以在 Global.asax 中指定的路由中自定义。在 global.asax 中有代码 sn-ps 看起来像

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这会将 A/B/C 形式的 url 路由到 AController,ActionResult B 参数 Id=3

我希望这些信息足以帮助您寻找合适的教程来学习。如果您仍然是学生(或者仍然有大学电子邮件或有朋友),请观看视频http://www.pluralsight.com/training 他们有很棒的介绍视频,可以帮助您学习 mvc3/4 基础知识。

【讨论】:

  • 您好 - 感谢您的回答!问题是我正在使用 GET 请求,因此我设置了路由 - 就像链接问题中的 Julian 一样 - 请求中使用了查询字符串,因为可以理解,浏览器不知道我设置的路由。因此,我希望编写一个自定义路由来理想地进行 301 重定向,但是客户端显然也有一些库可以使用客户端设置的路由获取表单 - 只是其中许多不同,我真的走不远跟他们。也许我可以采取比教程更好的搜索方法来允许路由?但它似乎相当健壮。
  • 我还是不清楚你在问什么,你可以访问控制器中的查询字符串。您正在尝试使用查询字符串重定向到另一个控制器?你也可以这样做。
  • 我想使用路由而不是浏览器用于 GET 请求的查询字符串,但我不知道如何在 RouteConfig 中编写客户 301 路由(并且库的类型、大小和使用 - 我不知道从哪里开始,但更喜欢自定义路线选项)。用我的实际代码和上下文中的问题编辑了答案。
  • 感谢您的有用编辑。是的,我正在使用具有相同控制器和 actionresult 的 get 请求,所以如果每个请求都使用路由,我显然不应该遇到查询字符串?还遇到其他奇怪的行为:localhost:xxxx/Movies/SearchIndex 触发搜索文本框以在操作时填充“SearchIndex”,而不是标题参数的参数。另外,在 TB 中使用此“SearchIndex”按过滤器后,我得到localhost:xxx/Movies/SearchIndex?Genre=&Title=SearchIndex 以提供我得到的特定查询字符串。我的路线可能有问题?
  • 我的意思是 global.asax 中的路由用于确定每个请求的路由。此外,我发现您可能在控制器中多次重复相同的操作 SearchIndex。在每个实例中,它接受不同的参数并返回不同的结果(称为重载)。查询字符串是 get 请求自动将表单上的信息附加到 url 的结果。这是意料之中的,也是正常的。
猜你喜欢
  • 2018-05-26
  • 2021-10-14
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多