我正在深入研究MVC 4 WebGrid的代码,我看到它被用作这个
grid.Column("Id", format: (item) => item.GetSelectLink(item.Id)),
Run Code Online (Sandbox Code Playgroud)
我不确定"item"参数是什么,所以我查看了源代码,看起来它是一个"WebGridRow"类.对我来说问题是,上面的代码正在寻找一个".Id"属性,但它在类中不存在.唯一一个靠近它的地方看起来像是下面的
public object this[string name]
{
get
{
if (String.IsNullOrEmpty(name))
{
throw new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, "name");
}
object value = null;
if (!TryGetMember(name, out value))
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
HelpersResources.WebGrid_ColumnNotFound, name));
}
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
我从未见过像"this [string name]"这样定义的属性,这是什么意思?动态属性?
我试图在网上搜索,但不知道要搜索什么,我无法得出任何结果/解释.
请帮忙.谢谢
这可能是一个愚蠢的问题,但我正在开发一个组件,我有一个类具有如下属性的类
public class Grid()
{
..
public IDecorator Decorator { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是让用户以下列方式指定自己的实现IDecorator的自定义类
...BuildGrid(
grid=>{
..
grid.Decorator = [CustomNameSpace].[DecoratorClass]
//as in
grid.Decorator = Com.MyCompany.DivDecorator
..
});
Run Code Online (Sandbox Code Playgroud)
Com.MyCompany.DivDecorator实现了IDecorator接口.那么我应该如何在没有最终用户指定"new"关键字的情况下执行此操作
grid.Decorator = new Com.MyCompany.DivDecorator();
Run Code Online (Sandbox Code Playgroud)
我知道我在这里错过了一些关键的c#概念.
谢谢
[编辑]
我试图做像这里的Java DisplayTag库这样的事情
http://www.displaytag.org/1.2/tut_decorators.html
他们这样做的方式是
... decorator="org.displaytag.sample.Wrapper"
所以我想而不是
public IDecorator Decorator { get; set;}
Run Code Online (Sandbox Code Playgroud)
我应该做
public String Decorator (get; set;}
Run Code Online (Sandbox Code Playgroud)
然后在内部使用TypeOf()来解决它....只是想知道是否有任何其他方式优雅地在C#中执行它.
谢谢
如何使用可选的泛型类型创建泛型方法?这就是我现在所拥有的,这是有效的
public GridViewColumn<T> Column<D>(String HeaderText, D decorator) where D: IColumnDecorator, new()
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
column.Decorator = new D();
return column;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要在Column()方法中实例化类型D(实现IColumnDecorator).
问题是,"D"类型是可选的.如果是Null,我想明确使用我拥有的默认ColumnDecorator.就像是
public GridViewColumn<T> Column<D>(String HeaderText, D decorator) where D: IColumnDecorator, new()
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
if(decorator ==null)
{
column.Decorator = new DefaultColumnDecorator();
}
else{
column.Decorator = new D();
}
return column;
}
Run Code Online (Sandbox Code Playgroud)
请帮忙.谢谢!
[编辑].
如果我有一个自定义的IColumnDecorator实现,我想在razor MVC中使用它
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column<MyOwnColumnDecorator>("FirstColumn")
)
});
Run Code Online (Sandbox Code Playgroud)
如果我没有任何想要使用默认值,那么我希望能够做类似的事情
@Model.[IEnumerable].Grid(grid=>{
..
... …
Run Code Online (Sandbox Code Playgroud) 我有这个字符串
<p/><ul><li>test1<p/></li><li>test2<p/></li></ul><p/>
Run Code Online (Sandbox Code Playgroud)
我尝试做的是提取"li"标签中的所有"p"标签,但不提取其外部的"p"标签.
到目前为止,我只能通过提取所有"li"标签
\<li\>(.*?)\</li\>
Run Code Online (Sandbox Code Playgroud)
我迷失了如何在其中提取"p"标签.
任何指针都非常感谢!!
我似乎无法在MVC Webgrid的源代码中将以下代码拼凑在一起.
当我们构建网格列时,我们会说
grid.Column("Id", format: (item) => item.GetSelectLink(item.Id)),
Run Code Online (Sandbox Code Playgroud)
"item"显然是一个lambda参数,它实际上是一个"WebGridRow"类.(我认为!!除非我错了)在这里查看源代码
https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Helpers/WebGrid/WebGridRow.cs
我的问题是,"Id"不是这个类的属性,并且由于WebGridRow继承自DynamicObject,".Id"属性究竟是如何映射到当前行的"源对象"的?
顺便说一下,源对象"对象值"通过WebGridRow的构造函数传递
public WebGridRow(WebGrid webGrid, object value, int rowIndex)
{
_grid = webGrid;
_value = value;
_rowIndex = rowIndex;
_dynamic = value as IDynamicMetaObjectProvider;
}
Run Code Online (Sandbox Code Playgroud)
列定义
public Func<dynamic, object> Format { get; set; }
Run Code Online (Sandbox Code Playgroud)
列在"WeBGridRenderer"类中调用为
foreach (var row in webGrid.Rows)
{
.....
foreach (var column in columns)
{
var value = ...Format(column.Format, row).ToString();
...
}
}
Run Code Online (Sandbox Code Playgroud)
最后,"WeBGridRenderer"中的"格式"函数
private static HelperResult Format(Func<dynamic, object> format, dynamic arg) {
var result = format(arg); …
Run Code Online (Sandbox Code Playgroud)