Как получить значение <# = Id #> при передаче вспомогательному методу - PullRequest
2 голосов
/ 02 февраля 2012

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

У меня есть сетка, отображающая список приложений. Каждое приложение имеет состояние. Мне нужно написать вспомогательный метод для отображения ссылок в каждой строке сетки в зависимости от текущего состояния каждого приложения. Если состояние 1, то мне нужно отобразить ссылку «Изменить». Помощник, который у меня есть, выглядит так:

public static string ActionLinks(this HtmlHelper helper, string grantApplicationId, string grantApplicationStateId)
{
     List<TagBuilder> linkList = new List<TagBuilder>();
     string actionLinks = string.Empty;

     if (grantApplicationStateId == "1")
     {
          // Edit link
          TagBuilder editLink = new TagBuilder("a");
          editLink.MergeAttribute("href", "/GrantApplication/Edit/" + grantApplicationId);
          editLink.InnerHtml = "Edit";
          linkList.Add(editLink);
     }

     foreach (TagBuilder link in linkList)
     {
          actionLinks += link.ToString() + "<br>";
     }

     return actionLinks;
}

Столбец сетки в моей сетке Telerik выглядит так:

column.Bound(x => x.Id)
     .ClientTemplate(@Html.ActionLinks("<#= Id #>", "<#= GrantApplicationStateType.Id #>"))
     .Title("Actions");

Модель моего вида выглядит так:

public class GrantApplicationListViewModel
{
     // Just partial properties
     public GrantApplicationStateType GrantApplicationStateType { get; set; }
}

И GrantApplicationStateType выглядит так:

public class GrantApplicationStateType : IEntity
{
     public int Id { get; set; }
     public string Name { get; set; }
}

При вызове вышеупомянутого вспомогательного метода значение grantApplicationStateId равно "<# = GrantApplicationStateType.Id #>". Как бы я получить значение, которое было передано? Я имею в виду, что если было передано значение 1, как бы получить 1, потому что в настоящее время это «<# = GrantApplicationStateType.Id #>»?

ОБНОВЛЕНИЕ 2012-02-06

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

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

Мне нужно пройти через 2 значения. Мне нужно сделать пару операторов if для идентификатора состояния приложения предоставления, а затем вернуть клиенту ссылки на конкретные действия. Но происходит сбой при циклическом просмотре значений в:

if (memberExpression.Expression is ParameterExpression)
     value = string.Format("<#= {0} #>", memberExpression.Member.Name);
else
     value = GetValue(memberExpression);

Первый переданный параметр проходит через первую / истинную часть оператора if:

value = string.Format("<#= {0} #>", memberExpression.Member.Name);

.. но второй параметр проходит через ложную часть if:

value = GetValue(memberExpression);

Какая разница между 2?

А затем происходит сбой в методе GetValue со следующим сообщением:

variable 'item' of type MyProject.ViewModels.GrantApplicationListViewModel' referenced from scope '', but it is not defined

Я не могу заставить это работать, и я искал еще несколько образцов и не мог найти.

1 Ответ

3 голосов
/ 02 февраля 2012

Вы не можете сделать это с помощью помощника. В ASP.NET MVC помощники запускаются на сервере. Обратите внимание на имя ClientTemplate в сетке Telerik? Это предназначено для запуска на клиенте.

Что он делает, так это то, что он просто использует <#= Id #> в качестве заполнителя для помощника на стороне сервера, который сгенерирует некоторый HTML, и на стороне клиента , сетка Telerik будет выполнять простую замену строки в порядке поставить значение, которое известно только клиенту.

В тот момент, когда ваш серверный ActionLinks помощник вызывается, сетка Telerik не может передать вам фактическое значение, известное только клиенту.

Вы можете взглянуть на следующую запись в блоге для хорошего расширения.

...