ViewData和HtmlHelper.Partial之谜

时间:2015-08-26 13:58:32

标签: c# asp.net-mvc asp.net-mvc-4 html-helper asp.net-mvc-partialview

我试图找出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.ViewDataHtml.ViewContext.ViewData都不包含在MainView中设置的Title数据,两者都包含新内容添加元数据对象。

然而在HtmlHelper的Partial扩展方法中存在完全不同的情况 - htmlHelper的ViewData不包含元数据设置,比我早一步,但包含在MainView中设置的Title属性(ViewData中没有{1}}早一步)。此外,htmlHelper.ViewContext.ViewData确实包含我的元数据对象,并且不像之前的步骤那样包含来自MainView的标题。

我的问题是 - 这是怎么发生的?我没有看到ViewData属性上的任何装饰器,或HtmlHelper和整个ViewData对象在一条指令中被更改 - 即调用部分扩展方法,甚至还没有执行此局部视图。

我的目标是将所有ViewData的元数据对象传递给局部视图,但结果我要么拥有元数据或Title(标题只是示例 - 它可能是一些更重要的属性)

0 个答案:

没有答案