扩展Telerik客户端模板列并获取传递的值
本文关键字:获取 Telerik 客户端 扩展 | 更新日期: 2023-09-27 18:22:44
我使用的是最新版本的Telerik MVC controls
。我使用ASP.NET MVC 3
和razor
。
我有一个表格,上面列出了我所有的助学金申请。我想使用一个网格,通过AJAX加载这些授权应用程序。我还需要创建一个具有操作链接的客户端模板列。这些行动链接可能因每个拨款申请的状态而异。
我在以下网站浏览了这篇文章:http://gedgei.wordpress.com/2011/07/02/telerik-mvc-grid-actionlink-column/.我按原样实现了代码,它很有效,我可以创建一个带有链接的客户端模板列。在我的场景中,我需要能够将2个参数传递给helper方法,比如:
column.ActionLink("Open", "Edit", "GrantApplication", item => new { id = item.Id, applicationStateId = item.GrantApplicationStateType.Id });
我最终如何实现这个方法将发生变化,但现在我正在处理这两个输入参数,看看它们是如何传递的,以及如何在helper方法中检索它们。
我对这篇文章的第一个问题是,作者为什么要做以下事情:
var builder = factory.Template(x =>
{
var actionUrl = urlHelper.Action(action, controller, routeValues.Compile().Invoke(x));
return string.Format(@"<a href=""{0}"">{1}</a>", actionUrl, linkText);
});
我只能假设这是创建的服务器端模板?但是网格中没有显示任何内容,那么我如何跳过这一部分并直接转到客户端模板(这正是我实际需要的)。
以下部分也令人困惑,因为当第一个参数(id)检查通过时,它的类型是ParameterExpression
,因此它进入if的true部分,但当第二个参数(授予应用程序状态id)进入时,它是另一种类型(不确定是什么),因此它进入if语句的false部分:
switch (argument.NodeType)
{
case ExpressionType.Constant:
value = ((ConstantExpression)argument).Value;
break;
case ExpressionType.MemberAccess:
MemberExpression memberExpression = (MemberExpression)argument;
if (memberExpression.Expression is ParameterExpression)
value = string.Format("<#= {0} #>", memberExpression.Member.Name);
else
value = GetValue(memberExpression);
break;
default:
throw new InvalidOperationException("Unknown expression type!");
}
当第二个paramenter值进入if语句的false部分时,它在这里失败:
value = GetValue(memberExpression);
并给出以下错误消息,我不知道它是什么:
variable 'item' of type MyProject.ViewModels.GrantApplicationListViewModel' referenced from scope '', but it is not defined
这是我的视图模型:
public class GrantApplicationListViewModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullNameDisplay
{
get { return FirstName + " " + LastName; }
}
public DateTime CreatedDate { get; set; }
public GrantApplicationStateType GrantApplicationStateType { get; set; }
}
在我看来,这是我的部分网格声明:
@(Html.Telerik()
.Grid<GrantApplicationListViewModel>()
.Name("grdGrantApplications")
.Columns(column =>
{
column.Bound(x => x.Id)
.ClientTemplate(
"<label class='"reference-number'"><a href='"" + @Url.RouteUrl(Url.GrantApplicationDetails("<#= Id #>")) + "'">" + "<#= Id #>" + "</a></label>"
)
.Title("Ref #")
.Width(70);
column.Bound(x => x.FullNameDisplay)
.Title("Owner")
.Width(200);
column.Bound(x => x.GrantApplicationStateType.Name)
.Title("Status")
.Width(90);
//column.ActionLink("Edit", "Edit", "GrantApplication", item => new { id = item.Id });
column.ActionLink("Open", "Edit", "GrantApplication", item => new { id = item.Id, applicationStateId = item.GrantApplicationStateType.Id });
})
.DataBinding(dataBinding => dataBinding.Ajax().Select("AjaxGrantApplicationsBinding", "Home"))
.Pageable(paging => paging.PageSize(30))
.TableHtmlAttributes(new { @class = "telerik-grid" })
)
我试图用上面的代码实现的效果是:
if grant application id = 1
then return Edit link and View link
else
then return Details link
我该怎么做呢?那篇文章中的代码是唯一的方法吗?难道没有更简单的方法吗?我在谷歌上搜索了一下,但在我想做的事情上找不到太多帮助。其他人遇到过这样的事情吗?
如果你只想让客户端模板根据应用程序id显示不同的内容,那么在客户端模板中放一个条件会更简单。
column.Bound(x => x.Id)
.ClientTemplate("<# if (Id == 1 ) { #> Edit Link and View Link <# } else { #> Details Link <# } #>");
"编辑"、"查看"answers"详细信息"链接的放置方式与不带条件的放置方式相同。