我有一个在多个视图页面中使用的局部视图(控件),我需要将当前视图的名称传递回控制器 - 所以如果有例如验证错误,我可以重新绘制原始视图.
解决方法是(在控制器方法中)
var viewName = "Details"; // or whatever
ViewData["viewName"] = viewName;
return(View(viewName, customer));
Run Code Online (Sandbox Code Playgroud)
然后在部分本身中,将其渲染为
<input type="hidden" name="viewName"
value="<%=Html.Encode(ViewData["viewName"])%>" />
Run Code Online (Sandbox Code Playgroud)
问题是 - 是否有一些属性或语法我可以直接检索它而不是从控制器设置它?我试过了明显的事:
<input type="hidden" name="viewName"
value="<%=Html.Encode(this.Name)%>" />
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我在这里错过了什么?
谢谢.
Haa*_*ked 36
好吧,如果您不介意将代码绑定到您正在使用的特定视图引擎,您可以查看ViewContext.View属性并将其转换为WebFormView
var viewPath = ((WebFormView)ViewContext.View).ViewPath;
Run Code Online (Sandbox Code Playgroud)
我相信最终会得到你的观点名称.
编辑: Haacked绝对是现货; 为了让事情变得更整洁我已经将逻辑包装在一个扩展方法中,如下所示:
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"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来完全像我追求的那样.
Kon*_*man 15
我有同样的问题,这就是我解决它的方式:
namespace System.Web.Mvc
{
public static class HtmlHelperExtensions
{
public static string CurrentViewName(this HtmlHelper html)
{
return System.IO.Path.GetFileNameWithoutExtension(
((RazorView)html.ViewContext.View).ViewPath
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中:
var name = Html.CurrentViewName();
Run Code Online (Sandbox Code Playgroud)
或者干脆
@Html.CurrentViewName()
Run Code Online (Sandbox Code Playgroud)
如果你只想要动作名称那么这就可以了:
public static string ViewName(this HtmlHelper html)
{
return html.ViewContext.RouteData.GetRequiredString("action");
}
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是使用 ViewBag。
public ActionResult Index()
{
ViewBag.CurrentView = "Index";
return View();
}
Run Code Online (Sandbox Code Playgroud)
在cshtml页面上
@{
var viewName = ViewBag.CurrentView;
}
Run Code Online (Sandbox Code Playgroud)
或者,
((RazorView)ViewContext.View).ViewPath
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43055 次 |
| 最近记录: |