Asp.Net MVC中存在一个视图吗?
有人知道在渲染视图之前是否可以确定控制器内是否存在特定的视图名称?
我有一个要求dynamic确定要呈现的视图的名称。 如果一个视图存在这个名字,那么我需要渲染该视图。 如果没有自定义名称的视图,那么我需要渲染一个默认视图。
我想在控制器中执行类似以下代码的操作:
public ActionResult Index() { var name = SomeMethodToGetViewName(); //the 'ViewExists' method is what I've been unable to find. if( ViewExists(name) ) { retun View(name); } else { return View(); } }
谢谢。
private bool ViewExists(string name) { ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); return (result.View != null); }
对于那些正在寻找复制/粘贴扩展方法的人:
public static class ControllerExtensions { public static bool ViewExists(this Controller controller, string name) { ViewEngineResult result = ViewEngines.Engines.FindView(controller.ControllerContext, name, null); return (result.View != null); } }
假设您只使用一个视图引擎,那么尝试类似以下内容的内容:
bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null;
这是另一个[不一定推荐]的方法
try { @Html.Partial("Category/SearchPanel/" + Model.CategoryKey) } catch (InvalidOperationException) { }
如果您想要在多个控制器操作中重复使用此操作,则可以根据Dave给出的解决scheme构build自定义视图结果,如下所示:
public class CustomViewResult : ViewResult { protected override ViewEngineResult FindView(ControllerContext context) { string name = SomeMethodToGetViewName(); ViewEngineResult result = ViewEngines.Engines.FindView(context, name, null); if (result.View != null) { return result; } return base.FindView(context); } ... }
然后在你的行为中简单地返回你的自定义视图的一个实例:
public ActionResult Index() { return new CustomViewResult(); }
ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null
我的2美分。