1

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

4

1 回答 1

1

编辑:晚上 8 点 46 分

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

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 执行“Get”请求。

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


响应编辑以关注如何访问查询字符串(重新路由路径)

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

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

 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 形式的 url 路由到 AController,ActionResult B,参数 Id=3

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

于 2013-06-16T04:33:05.820 回答