如何将两个参数从视图传递到控制器但在url中只显示一个?

时间:2013-08-30 16:57:07

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我正在MVC 4中构建一个应用程序,我只是坚持一件事。

我有一个控制器和动作:

public ActionResult Details(string pattern, int id)
{
    Post post = repository.GetPostById(id);

    return View(post);
}

在视图中:

<div class="innerbody">
    @Model.Description @Html.ActionLink("Czytaj dalej...", "Details", new { id = Model.PostId, pattern = Model.ShortUrl})
</div>

现在我要完成的是网址将是:

www.mysite.com/blog/pattern

没有id。 'pattern'是从帖子标题中提取的ShortUrl

我尝试将这些不同的路线添加到RouteConfig:

routes.MapRoute(
    name: "Details",
    url: "{Controller}/{pattern}",
    defaults: new {controller = "Blog", action = "Details", pattern = "", id = UrlParameter.Optional}
); 

routes.MapRoute(
    name: "Details",
    url: "{Controller}/{pattern}",
    defaults: new {controller = "Blog", action = "Details", pattern = ""}
);

但它一直在抛出错误:

  

参数字典在'MyBlog中为方法'System.Web.Mvc.ActionResult Details(System.String,Int32)'包含非可空类型'System.Int32'的参数'id'的空条目.Controllers.BlogController”。可选参数必须是引用类型,可空类型,或者声明为可选参数。

我想我无法抓住这个'路由'的事情......我怎么能完成这个任务?

1 个答案:

答案 0 :(得分:1)

如果您只是不希望id出现在网址中但又希望将其发送到操作中,那么最简单的做法就是POST它,或者使用表单或AJAX。

@using (Html.BeginForm("Details", "Blog", new { pattern = Model.ShortUrl }))
{
    @Html.HiddenFor(m => m.PostId)
}

OR

$.post(
    @Url.Action("Details", "Blog", new { pattern = Model.ShortUrl }),
    new { id: Model.PostId }
);

你的任何一条路线都应该没问题,但如果你不打算从网址中提取id,就没有必要提及POST

不可否认,对于适合GET的场景使用GET是奇怪的,但在POST中,您只能通过URL发送信息,即路由值和查询字符串。使用id允许您在表单集合中发送它,这显然在URL中看不到,但MVC将检查其模型绑定的值,这使您仍然可以获取{{1}}作为操作方法参数