设置多个操作

时间:2013-07-12 02:06:08

标签: asp.net asp.net-mvc

我想知道是否有可能在链接中有超过1个动作。例如,如果我想要多个链接,例如:

http://www.mywebsite.com/(CONTROLLER)/(ID)/(ACTION)

[HTTP://] www.mywebsite.com/user/Micheal/EditMovies [HTTP://] www.mywebsite.com/user/Micheal/EditFavorites

有没有某种方法可以做到这一点?如果没有,我是否必须在函数中指定多个id,然后使用案例来确定将要发送到哪个页面?

在我的UserController.cs中,我有:

public ActionResult Index(string username)
    {
        if (username != null)
        {
            try
            {
                var userid = (Membership.GetUser(username, false).ProviderUserKey);
                Users user = entity.User.Find(userid);
                return View(user);   
            }
            catch (Exception e)
            {

            }
        }
        return RedirectToAction("", "Home");
    }

在我的路线中,我有:

routes.MapRoute(
            name: "User",
            url: "User/{username}",
            defaults: new { controller = "User", action = "Index" }
        );

我正在尝试做的是为第二个动作提供额外的功能,所以我可以做类似的事情:

User/{username}/{actionsAdditional}

在我的UserController中,我可以将更多动作引导到第二个动作actionsAdditional

public ActionResult Index(string username)
    {
        if (username != null)
        {
            try
            {
                var userid = (Membership.GetUser(username, false).ProviderUserKey);
                Users user = entity.User.Find(userid);
                return View(user);   
            }
            catch (Exception e)
            {

            }
        }
        return RedirectToAction("", "Home");
    }

public ActionResult EditFavorites()
    {

// DoStuff         }

1 个答案:

答案 0 :(得分:0)

你可以用多种方式做到这一点,这里只有一个:

设置处理此问题的路线:

routes.MapRoute("UserEditsThings",
    "user/{id}/edit/{thingToEdit}",
    new { controller = "UserController", action="Edit" },
    new { thingToEdit = ValidThingsToEditConstraint() }
);

然后,User控制器中的操作应如下所示:

public ActionResult Edit(ThingToEdit thingToEdit) {
    ThingToEditViewModel viewModel = new ThingToEditViewModel(thingToEdit);
    return View(viewModel);
}

RouteConstraint是他们的输入(thingToEdit),并确保它是有效的(你可以在一些地方这样做 - 比如在Custom ModelBinder中):

public class ValidThingsToEditConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        //simplistic implementation simply to show what's possible.
        return values['thingToEdit'] == "Favorites" || values['thingToEdit'] == "Movies";

    }
}

现在,通过这种方式,您可以使用一种方法来编辑电影和收藏夹,只需添加一个参数即可显示他们正在编辑的内容的“类型”。

如果您想保留当前路线,您应该能够执行以下操作:

routes.MapRoute("UserEditsThings",
    "user/{id}/edit{thingToEdit}",
    new { controller = "UserController", action="Edit" },
    new { thingToEdit = ValidThingsToEditConstraint() }
);

我已经离开ASP.NET MVC大约7个月了,所以这可能有点生疏了。它尚未经过语法错误的测试,而python的部分可能会闪现。但它应该让你到那里。