我正在使用最新版本的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的真实部分,但是当第二个参数(授予应用程序状态ID)进入时,则它是另一种类型(不确定是什么类型),因此它进入if语句的错误部分:

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!");
}


当第二个参数值进入if语句的假部分时,它将在此处失败:

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


我该如何做?那篇文章中的代码是唯一的方法吗?有没有更简单的方法?我曾经做过Google,但在我想做的事情上找不到太多帮助。还有其他人遇到过这样的事情吗?

最佳答案

如果只需要客户端模板根据应用程序ID显示不同的内容,则只需在客户端模板中放置一个条件即可。

column.Bound(x => x.Id)
  .ClientTemplate("<# if (Id == 1 ) { #> Edit Link and View Link <# } else { #> Details Link <# } #>");


“编辑”,“视图”和“详细信息”链接的放置方式与无条件的放置方式相同。

08-25 11:21