在客户端的GET请求上路由

时间:2013-06-15 20:53:46

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

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

我无法理解如何使用GET请求对表单中的已定义路由和值执行操作。

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

作为一名初学者,很难与压倒性的客户端库相媲美,并且很难知道从哪里开始使用相关的自定义路由提供程序,但这对于保持服务器端路由和301重定向的简单性似乎更为可取。

尝试了不同的路线(显然不是'定制'),并查看了许多图书馆,但确实未能取得任何实际进展。

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


使用 this教程标题流派创建电影搜索页。]

以下是我的具体代码:

RouteConfig

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

1 个答案:

答案 0 :(得分:1)

编辑:8:46 PM

控制器/动作,即。可以重载搜索/索引以返回不同的结果,具体取决于是否存在查询字符串以及是否为获取请求等。

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 AM 在上面的代码中,有一行

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

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

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


在resoponse中编辑,专注于如何访问查询字符串(重新路由路径)

您可以直接绑定到查询字符串。为避免在其他答案上重复文本,请参阅 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中,有一些看起来像

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

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

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