使用Lambda表达式渲染HTML控件时遇NonFactors Grid.Mvc限制
解决NonFactors Grid.Mvc无法传递Lambda表达式的限制问题
我之前也碰到过这个棘手的问题,别慌,咱们来拆解下可行的解决思路:
首先得明确,官网SourceUrl示例里的columns.Add(model => ...)确实对复杂Lambda表达式支持有限,那咱们可以通过以下几种方式绕开这个限制:
方式一:用自定义列模板自由编写逻辑
放弃直接绑定属性,改用Template方法来渲染列内容,这样就能在模板里写任意复杂的Lambda逻辑了:
@model IEnumerable<Person> @(Html.Grid(Model).Build(columns => { columns.Add().Titled("Name").Template(person => @<text>@person.Name</text>); columns.Add().Titled("Surname").Template(person => @<text>@person.Surname</text>); // 这里可以轻松实现拼接、条件判断等复杂逻辑 columns.Add().Titled("Full Name").Template(person => @<text>@person.Name @person.Surname</text>); }))
方式二:在模型中新增计算属性
如果这个逻辑需要多处复用,最优雅的方式是给Person模型加一个计算属性,把逻辑封装在模型里:
public class Person { public string Name { get; set; } public string Surname { get; set; } // 计算属性直接返回处理后的结果 public string FullName => $"{Name} {Surname}"; }
之后在Grid里直接绑定这个新属性就行,完全符合原有的Lambda绑定语法:
@model IEnumerable<Person> @(Html.Grid(Model).Build(columns => { columns.Add(model => model.Name).Titled("Name"); columns.Add(model => model.Surname).Titled("Surname"); columns.Add(model => model.FullName).Titled("Full Name"); }))
方式三:用扩展方法封装逻辑
要是不想修改原模型,还可以写个静态扩展方法来封装处理逻辑:
public static class PersonExtensions { public static string GetFullName(this Person person) { return $"{person.Name} {person.Surname}"; } }
然后在Grid的模板里调用这个扩展方法就行:
@model IEnumerable<Person> @(Html.Grid(Model).Build(columns => { columns.Add().Titled("Full Name").Template(person => @<text>@person.GetFullName()</text>); }))
这几种方法都能完美解决Lambda表达式传递受限的问题,你可以根据自己的业务场景选最合适的方案。
内容的提问来源于stack exchange,提问作者Waseem Bukhsh
相关产品推荐
相关产品推荐

