我正在尝试实现用户友好的URL,同时保留现有路由,并且能够使用控制器顶部的ActionName标记(Can you overload controller methods in ASP.NET MVC?)
我有2个控制器:
ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName) { ... }
public ActionResult Index(long id) { ... }
基本上,我要做的是将用户友好的URL存储在每个项目的数据库中。
如果用户输入URL / Project / TopSecretProject / ,则会调用 UserFriendlyProjectIndex 操作。我进行数据库查找,如果一切都检查出来,我想应用与Index操作中使用的完全相同的逻辑。
我基本上试图避免编写重复的代码。我知道我可以将公共逻辑分成另一种方法,但我想知道在ASP.NET MVC中是否有内置的方法。
有什么建议吗?
我尝试了以下操作,但是我找不到View错误消息:
[ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName)
{
var filteredProjectName = projectName.EscapeString().Trim();
if (string.IsNullOrEmpty(filteredProjectName))
return RedirectToAction("PageNotFound", "Error");
using (var db = new PIMPEntities())
{
var project = db.Project.Where(p => p.UserFriendlyUrl == filteredProjectName).FirstOrDefault();
if (project == null)
return RedirectToAction("PageNotFound", "Error");
return View(Index(project.ProjectId));
}
}
以下是错误消息:
The view 'UserFriendlyProjectIndex' or its master could not be found. The following locations were searched:
~/Views/Project/UserFriendlyProjectIndex.aspx
~/Views/Project/UserFriendlyProjectIndex.ascx
~/Views/Shared/UserFriendlyProjectIndex.aspx
~/Views/Shared/UserFriendlyProjectIndex.ascx
Project\UserFriendlyProjectIndex.spark
Shared\UserFriendlyProjectIndex.spark
我正在使用SparkViewEngine作为视图引擎和LINQ到实体,如果这有帮助的话。 谢谢!
答案 0 :(得分:1)
除此之外,它可能需要付出优化才能只为项目打一次数据库......
ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName)
{
//...
//var project = ...;
return IndexView(project);
}
public ActionResult Index(long id)
{
//...
//var project = ...;
return IndexView(project);
}
private ViewResult IndexView(Project project)
{
//...
return View("Index", project);
}
答案 1 :(得分:0)
抱歉,看起来我正在回答我自己的问题!
我将调用返回到“wrapper”控制器内的Index控制器,然后在Index控制器中指定了视图名称。
ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName)
{
//...
//var project = ...;
return Index(project.ProjectId);
}
public ActionResult Index(long id)
{
//...
return View("Index", project);
}