带有参数处理动作的.net mvc路由

时间:2013-02-15 20:19:51

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

我想知道这是否可行(看起来应该是这样)

我希望有一条路线,例如:

/ events / {id} / addcomment

其中{id}是用于标识要添加评论的事件的参数。我知道我可以简单地做/ events / addcomment / {id},但这不是我想要路由这个动作的方式,所以这是我到目前为止看到的其他SO帖子

我在global.asax文件中注册路由 -

        routes.MapRoute(
            "AddComment",
            "Events/{id}/AddComment",
            new { controller = "Events", action = "AddComment", id = "" }
        );

然后我在我的事件控制器中的动作 -

[ActionName("{id}/AddComment")]
public ActionResult AddComment(int id)
{
    Event _event = db.Events.Find(id);
    var auth = OAContext.LoginRedirect("Must be logged in to add a comment");
    if (auth != null)
        return auth;
    else if (_event == null)
        return HttpNotFound();
    else
        return View(_event);
}

我在使用和不使用ActionName注释的情况下尝试了这个,并不完全确定我在这里做错了什么。

稍后我计划使用/ events / {eventId} / comment / {commentId} / {action}等路线,允许用户编辑/删除活动中的评论,但首先我需要弄清楚具体如何路由这个。

我问这个的原因是我没有看到任何其他参数样本在网址中进行操作,所以也许我只是不能这样做,如果是这样,那就好了。< / p>

我的问题:这种网址格式是否可行?若然,将此代码编码到路由和控制器中的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这是一条应该有效的路线:

routes.MapRoute(
   "AddComment",
   "Events/{id}/AddComment",
   new { controller = "Events", action = "AddComment" }
);

您无需在操作中使用任何ActionName属性即可。只需确保您已将此路线定义为之前您的默认路线。另请注意,由于{id}路由参数不是路由定义的最后一部分,因此它不再是可选的。生成路径时,应始终为其指定值。

例如:

@Html.ActionLink(
    "click me", 
    "AddComment", 
    "Events",
    new { id = "123" },
    null
)