我可以为返回视图简化此代码吗?它看起来非常冗余。

6

有没有一种方法将它们缩小为一个组结果?我有一组页面,像这样简单地返回静态内容,认为肯定有更有效率的方法来做到这一点。

    public ActionResult Research()
    {
        return View();
    }

    public ActionResult Facility()
    {
        return View();
    }

    public ActionResult Contact()
    {
        return View();
    }

编辑:感谢所有的回复 :)


这是微软ASP.NET MVC3框架中控制器的代码。 - Travis J
3
可以删除换行符。 - SLaks
是的,特别是可以通过将它们分组到一个区域中并最小化它们来删除它们占用的空间。但我希望有一种方法可以使用数组或结构体或其他东西来应用通用的“return view()”。 - Travis J
你想在数组中打包多少个不同的视图?对于小于10个视图,我认为这(上面)是最好的方法。 - LukeP
3个回答

9
你可以创建一个共享的 action 方法,该方法需要带有 viewName 参数:
public ActionResult Show(string viewName)
{
    return View(viewName);
}

您可以将这些名称路由到此操作:
routes.MapRoute(
    "Simple Content",
    "/{viewName}",
    new { controller = "Something", action = "Show" },
    new { viewName = "Research|Facility|Contact" }
);
viewName 约束条件是必需的,以防止此路由匹配任意 URL。
请注意,这是一种信息泄露漏洞;攻击者可以请求 /ControllerName/Show?viewName=~/Views/Secret/View。如果您有任何不使用模型的机密视图,则应在操作中验证 viewName。为此,您可以使用枚举,如 dknaack's answer

4
你比我先说了。我认为这种做法实际上不太直观,也不太可扩展,我个人会将其保留原样(OP)。 - LukeP

2
您可以创建一个新的路由,只需使用 controllername/{path},其中路径将是视图的名称,然后在控制器操作中进行如下设置。
public ActionResult Page(string path)
{
    return View(path);
}

因此,访问此路径

yourdomain.com/controllername/Ijusttest 将从 ~/Views/controllername/Ijusttest.cshtml 加载视图。您只需要确保从路由调用您的操作。

我希望这有意义。您可以以不同的方式设置它,这完全取决于您创建的路由。如果您需要路由代码方面的帮助,请告诉我。


0
您可能想要创建一个操作并传递一个参数作为页面名称,例如。
public StaticContent : Controller
{
  public ActionResult Pages(string id)
  {
    return View(id);
  }
}

id 可以拥有"Research", "Facility"等值。

你会得到像这样的 URL:/staticcontent/pages/research

只需要在StaticContent文件夹中命名视图为 Research.cshtml 就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接