【问题标题】:asp.net mvc route using form get with 2 action and same viewasp.net mvc 路由使用表单获取,具有 2 个动作和相同的视图
【发布时间】:2017-10-05 09:43:15
【问题描述】:

在页面上进行搜索时出现 url 问题。因此,我使用 GET 方法在表单中使用带有年份文本框和搜索按钮的索引视图

索引.cshtml

@using (Html.BeginForm("Search", "Service", new { Year = Model.Year }, FormMethod.Get))
{
    <p>
        <div class="form-inline">
            @Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control", @placeholder = "Enter Year" } })
            <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-search"></span> Search</button>
        </div>
    </p>
}

我将 Search as actionName 放在 BeginForm 中,因为当重定向到服务/索引时,不应在第一时间加载服务数据。所以,我使用另一个动作,“搜索”来处理这个请求,如果用户没有输入年份,那么它将加载所有数据,但如果用户输入年份,它将根据年。

这是处理请求的控制器

ServiceController.cs

public ActionResult Index()
{
    var vm = new ServiceIndexViewModel();
    return View(vm);
}

public async Task<ActionResult> Search(int? year)
{
    var vm = new ServiceIndexViewModel();

    if (ModelState.IsValid)
    {
        var list = await service.Search(year);
        vm.Services = AutoMapper.Mapper.Map<IEnumerable<ServiceListViewModel>>(list);
    }

    return View("Index", vm);
}

以及处理路由的自定义路由

RouteConfig.cs

routes.MapRoute(
    "ServiceSearch",
    "Service/Search/{Year}",
    new { controller = "Service", action = "Search", Year = UrlParameter.Optional }
);

// default route
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Company", action = "Index", id = UrlParameter.Optional }

);

但我有这样的网址:

http://localhost:18132/Service/Search?Year=http://localhost:18132/Service/Search?Year=2017

我希望 url 像这样显示

http://localhost:18132/Service/Searchhttp://localhost:18132/Service/Search/Year/2017

我的路由有什么问题?如何解决?

【问题讨论】:

  • 添加new { Year = Model.Year } 作为路由参数是没有意义的,因为它是要绑定的输入值。您将表单提交给 GET 方法,这意味着输入的值只会作为查询字符串值添加(浏览器对您的服务器端路由定义一无所知。但是您可以使用 javascript 来构建 url 和使用location.href=..(并取消表单提交)
  • @StephenMuecke 是的,你是对的,但我从这个网站 stackoverflow.com/questions/28176634/… 获得了该代码。它有同样的问题,但为什么他能做到,而我却不行?有什么区别?
  • 该问题中接受的答案没有任何输入 - 它只是发回路由参数的硬编码值(并且 OP 只是有隐藏的输入,所以无论如何有一个表单都是无稽之谈)
  • this answer为例(除非您处理表单.submit()事件并取消它)
  • 是的,您的路由定义是服务器端代码 - 浏览器不知道它们。它也在 HTML 标准中定义

标签: c# asp.net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

首先你的路线应该这样定义:

routes.MapRoute(
    "ServiceSearch",
    "Service/Search/Year/{Year}",
    new { controller = "Service", action = "Search", Year = UrlParameter.Optional });

但是你的问题是你的代码没有落到这个定义的路线上,而是落到了默认路线上。确保默认路由在此路由下方,如果它仍然不起作用,请在此处评论我,我会告诉你我的想法。

【讨论】:

猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
相关资源
最近更新 更多