我试图找出htmlhelper的viewdata和viewcontext行为。情况就是这样:
MainView.cshtml:
@{ViewBag.Title = "add excercise";}
<h2>title</h2>
@using (Html.BeginForm())
{
@Html.Edit(p => p.Name)
@Html.Edit(p => p.BodyParts)
<button>Send</button>
}
我自己的编辑扩展程序方法:
public static MvcHtmlString Edit<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
html.ViewContext.ViewData.Add("Metadata", metadata);
html.ViewData.Add("Metadata", metadata);
var mvcString = html.Partial("MultiSelect", html.ViewData);
html.ViewContext.ViewData.Remove("Metadata");
html.ViewData.Remove("Metadata");
return mvcString;
}
Mvc HtmlHelper来自PartialExtensions.cs的部分扩展方法:
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName)
{
return Partial(htmlHelper, partialViewName, null /* model */, htmlHelper.ViewData);
}
我的想法是装饰Html.EditorFor
方法,所以我调用自己的编辑方法,在那里我为当前处理的viewmodel的属性创建元数据,然后将此元数据对象传递给局部视图,其中我最终会为装饰属性调用Html.Editor
。
现在是谜语 - 在我自己的编辑方法中,Html.ViewData
和Html.ViewContext.ViewData
都不包含在MainView中设置的Title
数据,两者都包含新内容添加元数据对象。
然而在HtmlHelper的Partial扩展方法中存在完全不同的情况 - htmlHelper的ViewData不包含元数据设置,比我早一步,但包含在MainView中设置的Title
属性(ViewData
中没有{1}}早一步)。此外,htmlHelper.ViewContext.ViewData
确实包含我的元数据对象,并且不像之前的步骤那样包含来自MainView的标题。
我的问题是 - 这是怎么发生的?我没有看到ViewData
属性上的任何装饰器,或HtmlHelper
和整个ViewData
对象在一条指令中被更改 - 即调用部分扩展方法,甚至还没有执行此局部视图。
我的目标是将所有ViewData
的元数据对象传递给局部视图,但结果我要么拥有元数据或Title
(标题只是示例 - 它可能是一些更重要的属性)