我有一个简单的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);
}
}
答案 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);
}
您可以制作自定义路线以指定所需的任何网址格式。