asp.net-mvc - 创建html帮助扩展以传递视图数据

时间:2014-09-17 22:02:11

标签: asp.net-mvc

这可能有点没用,但我想做的只是为了看看如何做,而且我觉得它比典型的方法更清洁。

现在,我可以将额外的ViewData传递给像这样的部分视图;

@Html.Partial( "path/to/partial", new ViewDataDictionary{{ "key", "value" }})

这很好,虽然我想知道,是否可以制作一个只需要清理一下的扩展方法?我已经尝试了几个小时了,我发现自己有点迷失,但我正试图走这条路......

@Html.Partial( "path/to/partial" ).With("key","data").With("key2","data2")

所以基本上,它只是语法糖。但是我无法让它发挥作用。还有其他人有类似的东西吗?

更新

我其实可能已经解决了这个问题。我不得不把这个想法颠倒过来得到我想要的结果。考虑到它有多么迟钝,我不确定我是否会使用它,但是学习它很有趣!我非常欢迎任何可以用来改善这种情况的见解。但基本上,诀窍是反过来做。

using System;
namespace System.Web.Mvc.Html {
    public static partial class PartialViewExtensions {
        /// <summary>
        /// An Html Helper specifically for rendering a partial view with a fluently declared ViewDataDictionary.
        /// </summary>
        public class PartialHtmlHelper : HtmlHelper
        {
            public PartialHtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer) 
                : base(viewContext, viewDataContainer) { }  
        }

        /// <summary>
        /// Prepare the upcoming partial view with view data.
        /// </summary>
        public static PartialHtmlHelper With( this HtmlHelper helper, string key, dynamic value ) {
            var partial = new PartialHtmlHelper( helper.ViewContext, helper.ViewDataContainer );
            partial.ViewData.Add( key, value );
            return partial;
        }

        /// <summary>
        /// Prepare the upcoming partial view with view data.
        /// </summary>
        public static PartialHtmlHelper With( this PartialHtmlHelper helper, string key, dynamic value ) {
            helper.ViewData.Add( key, value ); return helper;
        }

        /// <summary>
        /// Render a prepared partial view with readied view data.
        /// </summary>
        public static MvcHtmlString Using( this PartialHtmlHelper helper, string partialViewName ) {
            return helper.Partial( partialViewName, helper.ViewData );
        }
    }
}

这样就可以很容易地用流畅的链式方法声明。

@Html
   .With("alpha", "alpha.property" )
   .With("beta", "beta.property" )
   .With("gamma", "gamma.property")
   .With("epsilon", DateTime.UtcNow() )
   .With("sigma", "sigma.property" )
   .Using("Templates/Form/Slots")

1 个答案:

答案 0 :(得分:1)

因此Html.Partial是一种扩展方法,因此您无法向扩展方法添加扩展方法。