设置mvc路由

时间:2014-08-16 21:03:45

标签: c# asp.net-mvc

我正在尝试创建一个mvc应用程序。我有一个项目控制器,操作在下面

[AllowAnonymous]
    [HttpGet]
    public ActionResult Index()
    {
        //TODO: Browse
        return View();
    }

    [AllowAnonymous]
    [HttpGet]
    public ActionResult Index(long projectId)
    {
        using (var entity = new dixraContext())
        {
            var project = entity.Projects.FirstOrDefault(m => m.Id == projectId);

            if (project == null)
                return RedirectToAction("NotFound", "Error");
            else
                return RedirectToAction("Index", project.UrlName);
        }
    }


    [AllowAnonymous]
    [HttpGet]
    public ActionResult Index(string projectName)
    {
        using (var entity = new dixraContext())
        {
            var project = entity.Projects.Where(m => m.Name == projectName);
            return View(project);
        }
    }

我想显示网址

  

example.com/Project/ProjectName

但是当我输入网址时

  

example.com/Project/1

收到错误。

  

处理您的请求时出错

。作为回应。当我进入example.com/Project/Index/1时,我会进入第一个动作。

我还想从id解析项目并重定向到通常的Project / ProjectName url。

1 个答案:

答案 0 :(得分:0)

看起来你有相互矛盾的路线。在保留三个可能输入的同时解决此问题的一种方法是检查输入参数。

此外,您的RedirectToAction有一个字符串作为其第二个参数 - RedirectToAction的重载将第二个参数视为控制器名称,而不是路由对象:

假设您的路线文件看起来不错:

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

您的控制器操作可能是:

[AllowAnonymous]
[HttpGet]
public ActionResult Index(string projectName)
{
    if (string.IsNullOrWhiteSpace(projectName))
    {
        // return your empty view
    }

    int projectId;
    if (int.TryParse(projectName, out projectId))
    {
        projectName = GetProjectNameFromDatabase(projectId);
        return RedirectToAction("Index", new { projectName });
    }

    // return your view with your model
}

可能有更好的方法,但这样可行。