1

我想知道链接中是否可以有超过 1 个操作。例如,如果我想拥有多个链接,例如:

http://www.mywebsite.com/(控制器)/(ID)/(动作)

[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()
    {

//做东西 }

4

1 回答 1

0

你可以通过多种方式做到这一点,这里只是一种:

设置一个路由来处理这个:

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

然后您在UserController 中的操作应如下所示:

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

RouteConstraint将接受他们的输入(thingToEdit)并确保它是有效的(您可以在几个地方执行此操作 - 例如在自定义 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 的一些部分可能会发光。不过,它应该能让你到达那里。

于 2013-07-12T02:20:13.820 回答