目前,我正在为MVC编写自定义控件,从而扩展了HtmlHelper
。
我在这里与Expression<T>
合作,但我相对较新。
尽管我的代码正在运行,但我只想验证这是否正确。
我正在渲染一个控件,我可以流畅地为渲染控件添加属性。 向我的控件添加属性的方法是使用以下代码:
.Attributes(style => "width: 100%;")
当我想在渲染控件上使用多个属性时,可以多次调用此方法:
.Attributes(style => "width: 100%;")
.Attributes(id => "renderedControl")
为了呈现属性,我正在查找包含属性的表达式。
以下是我用于添加属性的方法签名:
public IGridConstructor<TModel> Attributes(Expression<Func<string, string>> expression)
所以,我传递的Expression
包含Func<string, string>
。
函数的输入参数是属性的名称,而输出参数是属于此属性的值。
这确实意味着限制:
style => "width: 100%;"
应呈现属性:style="width: 100%"
现在,我确实通过以下代码实现了这一目标:
private void AddAttribute(Expression<Func<string, string>> expression)
{
var propertyName = expression.Parameters[0].ToString();
var propertyValue = expression.Compile()(string.Empty);
GridAttributes.Add(propertyName, propertyValue);
}
这是一种正确的方法吗?我对这里的[0]
不满意。
非常感谢任何帮助。
答案 0 :(得分:2)
我会使用一个匿名对象,它可以让你添加多个属性,而不是链接你的表达式。
private void AddAttributes(object attributes)
{
foreach(var property in attributes.GetType().GetProperties())
{
GridAttributes.Add(
property.Name,
property.GetValue(attributes));
}
}
并称之为:
AddAttributes(new { style = "width: 100%;", id = "renderedControl" });