我如何在ASP.NET MVC中为2个控制器共享控制器逻辑,它们被覆盖

时间:2010-02-16 19:45:53

标签: asp.net-mvc routes

我正在尝试实现用户友好的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到实体,如果这有帮助的话。 谢谢!

2 个答案:

答案 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);
}