使用MVC 3(Razor)的ASP.NET部分视图和隐藏变量

时间:2011-10-11 05:24:01

标签: c# asp.net-mvc razor

从模型生成隐藏变量时,仅使用变量名称。如果使用模型的嵌套类/结构,则使用类/结构名称。这有助于发布表单,因为系统更容易看到它正在填充的对象。

但是,在使用部分视图时,我经常传入模型的部分内容,这意味着隐藏字段不再包含结构/类名。在重建回发的参数时,这可能导致数据冲突或丢失。有没有办法让Html.HiddenFor(或等效的)将类/结构名称放在前面?

1 个答案:

答案 0 :(得分:2)

两个选项:

  1. 使用Html.EditorFor(..)代替直接部分视图。 EditorFor考虑到用于到达该属性的前缀/ heirachy,或

  2. 在渲染子部分之前操纵T emplateInfo.HtmlFieldPrefix,这将导致子项呈现的每个字段自动加上前缀。

  3. 如果你选择选项(2),考虑声明一个帮助器,它将包含HtmlFieldPrefix操作,以防止你忘记重置它(我从其他地方撕掉了ChildPrefixScope下面的代码在一段时间之前)。

    例如:

    static public class MyHtmlHelpers
    {
        public static IDisposable BeginChildScope<TModel>(this HtmlHelper<TModel> html, string parentScopeName)
        {
            return new ChildPrefixScope(html.ViewData.TemplateInfo, parentScopeName);
        }
    
        private class ChildPrefixScope : IDisposable
        {
            private readonly TemplateInfo _templateInfo;
            private readonly string _previousPrefix;
    
            public ChildPrefixScope(TemplateInfo templateInfo, string collectionItemName)
            {
                this._templateInfo = templateInfo;
    
                _previousPrefix = templateInfo.HtmlFieldPrefix;
                templateInfo.HtmlFieldPrefix = collectionItemName;
            }
    
            public void Dispose()
            {
                _templateInfo.HtmlFieldPrefix = _previousPrefix;
            }
        }
    
    }