2010-04-06 1 views
0

Вот функциональность, которую я хотел бы использовать: у меня есть класс myClass и хотел бы перебрать коллекцию, содержащую все свойства этого класса. Я бы хотел отправить индекс этой коллекции вместе с другими данными, чтобы я мог управлять каждой последовательностью итерации.Как получить значение из ViewData, когда объект не является строкой?

Ниже приведены упрощенные версии метода Action и View (для этой функции я буду использовать одно и то же действие).

1) Действие

public ActionResult CreateHierarchy(int? index) 
{ 

    if(index < PropertiesOfMyClass.Lenght) 
    { 
    //Other code omitted 

    ViewData["index"] = ((index == null) ? 1 : index++); 

    Return View(); 
    } 
} 

2) Просмотр

<% Using(Html.BeginForm()){%>  
    //Other Code omitted 

    <% = Html.Hidden("Index", ViewData["index"])%> 
    <input type = "submit" value = "Do someting"/> 
<%}%> 

Я также разместил в нижней части страницы, так что я могу проверить значение индекса,

<% = ViewData["index"]%> 

К сожалению, не работает. Я получаю только номер 1. Я что-то упускаю? таких как бросок для Viewdata? Должен ли я написать что-то вроде этого:

<% = Html.Hidden("index", (int)ViewData["index"])%> 

Это не работает либо

======= EDIT 6 апреля/08h37AM

Настоящее имя MyClass является иерархия, которая содержит несколько уровней, как это

public class Hierarchy 
{ 
public int HierarchyID { get; set;} 
public string Level1 { get; set; } 
public string Level2 { get; set; } 
     ---- 
public string Level7 { get; set; } 
} 

Как только я выше свойства в коллекции, я могу перебирать эту коллекцию из Level1 в level7 по очереди (в качестве значения для каждого уровня может иметь множество источников). Индекс очень важен для меня как полагаться на него, чтобы двигаться вперед или назад.

Также я представил логику (1) в действии и в представлении (2), чтобы можно было следить за тем, как индекс передается между действием и представлением.

Спасибо за помощь

+0

Любой шанс, что PropertiesOfMyClass.Length возвращается 1 или ниже? Что произойдет, если вы удалите этот условный элемент так, чтобы независимо от индекса всегда увеличивался? – Lazarus

+0

Я вообще не вижу «MyClass» в вашем коде. Из того, что вы описываете, код производит именно то, что должно быть. Можете ли вы уточнить, что именно вы пытаетесь сделать, и каков именно результат? –

+0

Что называется: CreateHierarchy (int? Index)? Есть ли вероятность, что вы всегда передаете null в это, поэтому вместо инкремента int он всегда оценивает значение 1? – SlackerCoder

ответ

1

ли значение, которое вы первоначально передать в этот метод действий 1? Если это так, вы будете последовательно возвращать 1, когда используете операцию ++ как операцию постфикса. То есть, значение будет увеличиваться после того, как будет выполнено присвоение ViewData. Если вы выполняете префиксную операцию, ваша проблема должна быть решена, если, конечно, мое предположение верно.

Подробнее о действиях префикса v. Postfix см. В разделе ++ Operator article on MSDN.

Следует также указать, что ваше логическое выражение всегда будет оцениваться как false как Nullable <T> == null всегда является ложным. Вместо этого вам следует рассмотреть вопрос об изменении, что выражение (или нечто подобное):

ViewData["index"] = ((index.HasValue) ? index.Value + 1 : 1); 
+0

@MCGuire - Мне нравится ваше выражение. Теперь, как получить значение индекса, чтобы я мог снова ввести его обратно в Action Method? Это верно? - <% = Html.Hidden ("index", ViewData ["index"])%> - Это правильно? Интересно, может ли (возможно) добавить бросок перед ViewData - вроде этого - (int) ViewData ["index"] – Richard77

+0

@Rich, хороший улов! +1 – Lazarus

+0

Когда я это делаю - (int) ViewData ["index"] - как значение для скрытого поля, я получаю исключение - Object не установлен в экземпляр объекта. Итак, если каждый тег HTML сохраняет свое значение как строку, возможно, мне нужно какое-то отбрасывание в моем действии ??? – Richard77

0

После проверки другого форума, я вспомнил, что ViewData имеет значение, так что он может отображать его обратно в случае, если есть проблема.Чтобы получить функциональные возможности, я хочу, мне нужно, чтобы очистить первую ViewData, используя следующее заявление:

ViewData.ModelState.Clear(); 
ViewData["index"] = index + 1; 

или

ModelState.Remove("index") 
ViewData["index"] = index + 1; 

Второе утверждение, что это лучше, так как она имеет дело только с одной записью (в отличие от очистка всего словаря ViewData). После этого я могу повторно назначить новое значение = index + 1 (если я использую Clear()) или заново создаю новую запись с именем ViewData ["index"] и присвойте значение index + 1 к нему.

Спасибо за все ваши ответы.