Как получить значение при передаче в вспомогательный метод
Я использую 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;
}
Столбец сетки в моей сетке Телерика выглядит так: это:
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 равно "". Как я получу значение, которое было передано? Я имею в виду, если значение равно 1, которое было передано, как я получу 1, потому что в настоящее время это ""?
Обновление 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 ответ:
Вы не можете сделать это с помощью помощника. В ASP.NET помощники MVC работают на сервере. Обратите внимание на имя
ClientTemplateв сетке Телерика? Это должно работать на клиенте.То, что он делает, это то, что он просто использует
<#= Id #>в качестве заполнителя для помощника на стороне сервера, который будет генерировать некоторый HTML и на стороне клиента, сетка Telerik будет делать простую замену строки, чтобы поместить значение, которое известно только на клиенте.В данный момент вызывается помощник на стороне сервера
ActionLinks, сетка Telerik не может передать вам фактическое значение, которое известно только на клиенте.Вы можете посмотреть на следующий пост в блоге Для хорошего расширения.
Comments