К сожалению, @Html.DropDownListFor()
ведет себя несколько иначе, чем другие помощники при рендеринге элементов управления в цикле. Об этом ранее сообщалось как о проблеме с CodePlex (не уверен, что ее ошибка или просто ограничение)
. Это 2 варианта для решения этой проблемы, чтобы обеспечить выбор правильной опции на основе свойства модели
Вариант 1 (с использованием EditorTemplate
)
Создайте пользовательский EditorTemplate
для типа в коллекции. Создайте парциальное значение в /Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml
(обратите внимание, что имя должно соответствовать имени типа
@model yourAssembly.AggregationLevelConfiguration
@Html.DropDownListFor(m => m.HelperCodeType, (SelectList)ViewData["CodeTypeItems"])
.... // other properties of AggregationLevelConfiguration
, а затем в главном представлении передать SelectList
в EditorTemplate
как additionalViewData
@using (Html.BeginForm())
{
...
@Html.EditorFor(m => m.Configurations , new { CodeTypeItems = Model.CodeTypeItems })
...
Вариант 2 (сгенерируйте новую SelectList
на каждой итерации и установите selectedValue
)
В этом параметре ваше свойство CodeTypeItems
должно быть IEnumerable<GenericIdNameType>
, а не SelectList
(или просто сделать codeTypes
общедоступным свойством). Затем в главном представлении
@Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, new SelectList(Model.CodeTypeItems, "Id", "Name", Model.Configurations[0].HelperCodeType)
Сторона примечания: нет необходимости использовать new { id = "Configurations[0].HelperCodeType"
- метод DropDownListFor()
уже сгенерированный атрибут id
Я думаю, что проблема здесь в вашем коде
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
.....
....
//problem is here below line
return inflater.inflate(R.layout.input_fgmt, container, false);
}
возвращает уже завышенный вид
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
.....
....
return InputFragmentView;
}
изменить
return inflater.inflate(R.layout.input_fgmt, container, false);
на
return InputFragmentView ;
Также измените с помощью этого:
translate_button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Log.d("Test", "onClickListener ist gestartet");
Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
saveInString();
}
});
и импортируйте в качестве импорта android.view.View ;
Лучший способ получить все созданные взгляды, вы должны переопределить метод:
@Override
public void onActivityCreated(Bundle saved) {
super.onActivityCreated(saved);
input_text = (EditText) InputFragmentView.findViewById(R.id.input_field);
translate_button = (Button) InputFragmentView.findViewById(R.id.translate);
translate_button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
Log.d("Test", "onClickListener ist gestartet");
Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
saveInString();
}
});
, потому что этот метод называется после всех представлений. вы должны прочитать жизненный цикл фрагмента.
Измените ваш код
public class InputFragment extends Fragment implements View.OnClickListener
translate_button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View InputFragmentView)
{
Log.d("Test", "onClickListener ist gestartet");
Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
saveInString();
}
});