asp.net mvc route使用表单获取2个动作和相同的视图

时间:2017-10-05 09:43:15

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

我在网页上搜索时遇到网址问题。因此,我使用GET方法

在表单内部使用年份文本框和搜索按钮

Index.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>
}

我将搜索范围actionName放在BeginForm中,因为在重定向到服务/索引时,不应该首次加载服务数据。所以,我正在使用另一个Action,“Search”来处理这个请求,如果用户没有输入年份,那么它将加载所有数据,但是如果用户输入年份,它将加载基于年。

这是处理请求的控制器

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

我希望网址像这样显示

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

我的路由有什么问题?怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

首先,您的路线应该像这样定义:

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

但是你的问题是你的代码没有落到这个定义的路线上的问题,它落到了默认路线上。确保默认路线低于这条路线,如果它还没有工作,请在这里评论我,我会告诉你我的想法。