我有一个局部视图(控制),用于几个视图页面,我需要传递当前视图的名称回到控制器 – 所以如果有例如。验证错误,我可以重新绘制原来的视图。
var viewName = "Details"; // or whatever ViewData["viewName"] = viewName; return(View(viewName,customer));
然后在部分本身,渲染它
<input type="hidden" name="viewName" value="<%=Html.Encode(ViewData["viewName"])%>" />
问题是 – 是否有一些属性或语法我可以使用直接检索这个而不是设置它从控制器?我试过明显:
<input type="hidden" name="viewName" value="<%=Html.Encode(this.Name)%>" />
但这不工作。我在这里失踪了什么?
谢谢。
解决方法
如果你不介意你的代码绑定到你使用的特定视图引擎,你可以看看ViewContext.View属性,并将其转换为WebFormView
var viewPath = ((WebFormView)ViewContext.View).ViewPath;
我相信会得到你的视图名称在结束。
编辑:破解是绝对地点;为了使事情有点整洁我已经包装了逻辑上一个扩展方法,如:
public static class IViewExtensions { public static string GetWebFormViewName(this IView view) { if (view is WebFormView) { string viewUrl = ((WebFormView)view).ViewPath; string viewFileName = viewUrl.Substring(viewUrl.LastIndexOf('/')); string viewFileNameWithoutExtension = Path.GetFileNameWithoutExtension(viewFileName); return (viewFileNameWithoutExtension); } else { throw (new InvalidOperationException("This view is not a WebFormView")); } } }
这似乎做我完全正确的。