是否可以为同一控制器方法分配多个动作?

时间:2015-02-01 17:24:52

标签: c# asp.net-mvc asp.net-mvc-5

我有一个简单的MVC控制器,它根据View操作返回文件夹中的文件列表。 Index()操作包含一个集合列表,然后用户点击CollectionOne,就会填充相应的视图。相同的行为适用于其他集合。

问题是,我有很多冗余的代码,我通过使用所有操作调用的私有ActionContent()方法在某种程度上能够管理。因此,每当我有一个新的集合添加到网站时,我只需为此集合添加ActionResult并调用ActionContent()方法。

是否有任何方法可以优化此代码以使其更具动态性,而无需在每次需要发布新集合时添加新的ActionResult

我的控制器看起来像这样:

public class PortfolioController : Controller
{
    public ActionResult CollectionOne()
    {
        return View(ActionContent());
    }

    public ActionResult CollectionTwo()
    {
        return View(ActionContent());
    }

    private IEnumerable<string> ActionContent()
    {
        const string folder = @"~/Content/images/portfolio/";
        var path = folder + ControllerContext.RouteData.Values["action"];

        var files = Directory
            .EnumerateFiles(Server.MapPath(path))
            .Select(Path.GetFileName);

        return files;
    }
}

我想使用ActionNames或正确的route mapping将其转换为类似的内容(以避免冗余):

public class PortfolioController : Controller
{
    [ActionName("CollectionOne")]
    [ActionName("CollectionTwo")]
    [ActionName("CollectionThree")]
    public ActionResult PortfolioCollection()
    {
        const string folder = @"~/Content/images/portfolio/";
        var path = folder + ControllerContext.RouteData.Values["action"];

        var files = Directory
            .EnumerateFiles(Server.MapPath(path))
            .Select(Path.GetFileName);

        return View(files);
    }
}

1 个答案:

答案 0 :(得分:2)

这是参数的用途:

public ActionResult PortfolioCollection(string id)
{
    const string folder = @"~/Content/images/portfolio/";

    var files = Directory
        .EnumerateFiles(Server.MapPath(folder + id))
        .Select(Path.GetFileName);

    return View(files);
}

您可以制作自定义路线以指定所需的任何网址格式。