你能用参数做一些类似RoutePrefix的东西吗?

Sta*_*tan 9 c# asp.net-mvc routes asp.net-mvc-5

我想知道我是否可以做一些事情,RoutePrefix("{projectName}/usergroups")因为我有很多项目,每个项目都包含用户组.现在,在每个Usergroup控制器中,我首先需要得到Project与之相关的控制器.这可能吗?

我试过了什么

我只是尝试做RoutePrefix("projects/{projectName}"),然后在控制器构造函数中传递它,但它不会像那样工作.我也尝试使用Route而不是RoutePrefix在控制器级别,但我的路线内部不起作用.

[RoutePrefix("projects"), Authorization]
public class UsergroupController : Controller
{
    private readonly Project _project; // i would like to inject it here on constructor
    private readonly Account _account;
    private readonly IProjectRepository _projectRepository;

    public UsergroupController(IAuthorizationService auth, IProjectRepository projectRepository)
    {
        _projectRepository = projectRepository;
        _account = auth.GetCurrentAccount();
    }

    [Route("{projectName}/usergroups"), HttpGet]
    public ActionResult Index(string projectName)
    {
        // the problem that i will need to pass projectName
        // to every action and do this check in every action as well
        //
        // looks like totally ugly code-duplication
        var project = _projectRepository
            .GetByAccountId(_account.Id.ToString())
            .SingleOrDefault(x => x.Name == projectName);

        if (project == null)
        {
            return HttpNotFound();
        }

        // now get all usergroups in this project e.g. project.Usergroups

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 16

您可以使用带参数的路由前缀,但您的操作方法仍然必须接受参数,就像它是路径的一部分一样.您无法满足控制器构造函数的依赖关系:

[RoutePrefix("{projectName}/usergroups")]
public class UsergroupController : Controller
{
    [Route("")]
    public ActionResult Index(string projectName)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)