我正在尝试创建一个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。
答案 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
}
可能有更好的方法,但这样可行。