Я становлюсь полностью потерянным и смущенным о том, как использовать новый HTML со строгим контролем типов. Помощник DropDownListFor на ASP.NET MVC 2.0 R2
В Представлении я пишу:
<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
<%= Html.ValidationMessageFor(m => m.ParentCategory)%>
и мой Объект модели таким образом:
public class CategoryForm : FormModelBase
{
public CategoryForm()
{
Categories = new List<Category>();
Categories.Add(new CategoryForm.Category() {
CategoryId = 1,
Name = "CPUs" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 2,
Name = "Memory" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 3,
Name = "Hard drives" });
}
// ...other props, snip... //
public Category ParentCategory { get; set; }
public IList<Category> Categories { get; protected set; }
public class Category
{
public int? CategoryId { get; set; }
public string Name { get; set; }
}
}
Проблема состоит в том, что, когда я выбираю объект из выпадающего списка скажем первый объект, я добираюсь, следующая ошибка ValidationMessageFor "Значение '1' недопустима".
Таким образом, я изменяю Представление на...
<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**,
new SelectList .../ snip ) %>
Теперь это работает, отчасти. Свойство ParentCategory в моем ViewModel установлено с корректным 'CategoryId', но 'Имя' является ПУСТЫМ. Действительно ли я более обеспечен просто наличие nullable интервала для свойства ParentCategory вместо объекта 'Категории' со строгим контролем типов?
У меня тоже возникла та же проблема.
Когда я отлаживаю действие и смотрю, например, на ModelState.Values [1] .Errors [0] .Exception, я вижу следующее:
{"Преобразование параметра из типа 'System.String' в тип 'System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Int64, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]] 'не удалось, потому что преобразователь типов не может выполнять преобразование между этими типами. "} System.Exception {System.InvalidOperationException}
В моем сценарии мой список SelectList создается из словаря, и я использую его, на мой взгляд:
<%=Html.DropDownListFor(x => x.MyDictionary,
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Когда я изменил его на:
<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Он работал без проблем.
Спасибо.
<%= Html.DropDownListFor(m => m.ParentCategory,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.ParentCategory),
"[ None ]")%>
Вы пытались использовать Model.ParentCategory.CategoryId
в качестве последнего параметра в SelectList
и удалить параметр [None]
?