在WebGrid列中使用HTML.ActionLink中的数据,这是不可能的吗?

19

我在ASP.NET MVC3测试应用程序中有以下WebGrid。它显示客户列表:

@grid.GetHtml(
tableStyle: "grid",
headerStyle: "head",
alternatingRowStyle: "alt",
columns: grid.Columns
         (
         grid.Column(format: (item) => Html.ActionLink("Edit", "Details", new { id = item.id })),
         grid.Column("Address.CompanyName"),
         grid.Column("Address.City")
         )
)

这里有趣的部分是我在第一列中添加的“编辑链接”。我想使用客户账号代替普通的“编辑”文本。但是,这样做给我带来了很多问题。

我已经尝试过:

grid.Column(format: (item) => Html.ActionLink(item.AccountNumber.ToString(), "Details", new { id = item.id })),

然而,似乎有些地方我没有理解它的工作原理,因为我一直遇到这个异常:

CS1502: The best overloaded method match for 'System.Web.Helpers.WebGrid.Column(string, string, System.Func<dynamic,object>, string, bool)' has some invalid arguments

有谁能解释一下为什么这行代码没有生效?除了拼写之外,“Edit”和item.AccountNumber.ToString()之间有什么区别?

需要指出的是,使用“Edit”文本时链接可正常工作,而AccountNumber是一个长整型。

8个回答

28

这是一个关于如何使用日期的示例。

grid.Column(columnName: "Date", format: (item) => Html.ActionLink(((string)item.Date), "Edit", new { id = item.id })),          

你需要注意使用扩展方法(Html.*)和动态类型(item)时可能会出现问题...在进行新的{}投影或调用ToString时,它不再是动态的。或者,你可以进行强制转换:(object)item.Id。

来自这里


1
您说得一点没错!谢谢!如果我使用"(string)(item.AccountNumber.ToString())",它可以正常工作...不太确定为什么需要将其转换为字符串?我猜ToString()会返回一个字符串? - Thomas
我认为这个项目是动态的,所以它没有那个方法? - Derek Beattie

5

如果有人想知道VB中应该如何呈现,这里有一个例子:

grid.Column("PersonID", "Admin", Function(modelItem) Html.ActionLink("View", "Details", New With {.id = modelItem.PersonID}))

2
在我的情况下,Derek Beattie的解决方案不起作用。我使用了以下内容。
 grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.ID }), style: "column-action") 

1

我的列是在模型中生成的,其中Html.ActionLink似乎无法访问。因此,我不得不创建href并将其作为MvcHtmlString返回。这就是我最终所做的。

new WebGridColumn{ColumnName="FileName", Header= "File",
                Format = item => new MvcHtmlString("<a href='" + item.FileLink + "'>" + item.FileName +"</a>")

0
 @Html.Grid(Model).Columns(columns => {
    columns.Add(c => c.ConsumerNo).Titled("Consumer No").SetWidth(70).Filterable(true);
    columns.Add(c => c.ConsumerName).Titled("Consumer Name").SetWidth(200).Filterable(true);
    columns.Add(c => c.MobileNo).Titled("Mobile No").SetWidth(70).Filterable(true);
    columns.Add(c => c.Address).Titled("Address").SetWidth(200).Filterable(true);
    columns.Add(c => c.AreaName).Titled("Area Name").SetWidth(70).Filterable(true);
    columns.Add(c => c.StaffName).Titled("Staff Name").SetWidth(100).Filterable(true);
    columns.Add().Encoded(false).Sanitized(false).Titled("INSPECT").SetWidth(60).RenderValueAs(o => Html.ActionLink("INSPECT", "InspForm", new { id = o.UniqueConsumerId, style = "background-image:url('~/Images/orderedList1.png')" }));                       
}).WithPaging(10).Sortable(true)

0
我是这样解决的: < p > < code > grid.Column(“Id”,format:(item)=> Html.ActionLink((string)item.id.ToString(),“Edit”,new {id = item.id}))

0
我使用以下代码来创建网格,它对我有效。
@grid.GetHtml(
    columns: grid.Columns(
        grid.Column(header: "Serial No", format:@<text><div>@(item.WebGrid.Rows.IndexOf(item) + 1)</div></text>),
        grid.Column(columnName: "Stdname", header: "Student Name"),
        grid.Column(header: "Email ID", format:@<text><a href="mailto:@item.Email">@item.Email</a></text>),
        grid.Column(header: "EDIT",format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.ID })),
        grid.Column(header: "DETAILS", format: (item) => Html.ActionLink("Details", "Details", new { id = item.ID })),
        grid.Column(header: "DELETE", format: (item) => Html.ActionLink("Delete", "Delete", new { id = item.ID }))
))

希望这对你有所帮助。


-1
 grid.Column("GiftID",canSort:false, format: (item => Html.ActionLink((string)(@item.GiftID).ToString(), "Edit", new { GiftID = @item.GiftID })))

1
这个回答并没有帮助回答问题。它提供了一个解决方案,语法似乎是正确的,但你应该进一步解释为什么要使用这个解决方案,并尝试回答问题或解释为什么要使用这个解决方案以及为什么之前的语法不起作用。 - Eric Bishard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接