我正在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”。可选参数必须是引用类型,可空类型,或者声明为可选参数。
我想我无法抓住这个'路由'的事情......我怎么能完成这个任务?
答案 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}}作为操作方法参数