Расширение столбца шаблона клиента Telerik и получение значений, передаваемых через - PullRequest
2 голосов
/ 07 февраля 2012

Я использую последнюю версию Telerik MVC controls.Я использую ASP.NET MVC 3 с razor.

У меня есть сетка, в которой перечислены все мои заявки на гранты.Я хочу использовать сетку, которая загружает эти заявки на гранты через AJAX.Мне также нужно создать столбец шаблона клиента, который имеет ссылки на действия.Эти ссылки действий могут различаться в зависимости от состояния каждого грантового приложения.

Я работал над статьей по адресу: http://gedgei.wordpress.com/2011/07/02/telerik-mvc-grid-actionlink-column/. Я реализовал код как есть, и он работает, я могу создать столбец шаблона клиентасо ссылкой в ​​нем.В моем сценарии мне нужно иметь возможность передать 2 параметра вспомогательному методу, например:

column.ActionLink("Open", "Edit", "GrantApplication", item => new { id = item.Id, applicationStateId = item.GrantApplicationStateType.Id });

То, как я в конечном итоге реализую этот метод в конце, изменится, но сейчас я играю с этими 2входные параметры, чтобы увидеть, как они передаются и как я могу получить их с помощью вспомогательного метода.

Первый вопрос, который у меня возник относительно статьи, почему писатель делает следующее:

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, но когда приходит второй параметр (предоставить идентификатор состояния приложения), он имеет другой тип (не уверен, что), поэтому он идетв ложную часть оператора 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 и не мог найти большую помощь в том, что я хочу сделать.Кто-нибудь еще сталкивался с чем-то вроде этого?

1 Ответ

2 голосов
/ 07 февраля 2012

Если все, что вам нужно, это чтобы клиентский шаблон отображал различное содержимое на основе идентификатора приложения, было бы проще просто вставить условное выражение в клиентский шаблон.

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

Ссылки «Правка», «Просмотр» и «Сведения» будут вставлены таким же образом, как и без условных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...