Ошибка означает, что значение CategoryList
равно нулю (и в результате метод DropDownListFor()
ожидает, что первый параметр имеет тип IEnumerable
).
Вы не генерируете вход для каждого свойства каждого SelectListItem
в CategoryList
(и не должен), поэтому никакие значения для SelectList
не отправляются в метод контроллера, и поэтому значение model.CategoryList
в методе POST равно null
, Если вы вернете представление, вы должны сначала переназначить значение CategoryList
, как и в методе GET.
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // add this
return View(model);
}
// Save and redirect
}
Чтобы объяснить внутреннюю работу (исходный код может быть см. здесь )
Каждая перегрузка DropDownList()
и DropDownListFor()
в конечном итоге вызывает следующий метод
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
string optionLabel, string name, IEnumerable selectList, bool allowMultiple,
IDictionary htmlAttributes)
, который проверяет, есть ли selectList
(второй параметр из @Html.DropDownListFor()
) является null
// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
selectList = htmlHelper.GetSelectData(name);
usedViewData = true;
}
, который, в свою очередь, вызывает
private static IEnumerable GetSelectData(this HtmlHelper htmlHelper, string name)
, который оценивает первый параметр @Html.DropDownListFor()
(в данном случае CategoryID
)
....
o = htmlHelper.ViewData.Eval(name);
....
IEnumerable selectList = o as IEnumerable;
if (selectList == null)
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
MvcResources.HtmlHelper_WrongSelectDataType,
name, o.GetType().FullName, "IEnumerable"));
}
Поскольку свойство CategoryID
является typeof int
, оно не может быть передано в IEnumerable
, и генерируется исключение (которое определено в файле MvcResources.resx
как)
The ViewData item that has the key '{0}' is of type '{1}' but must be of type '{2}'.
Раньше у меня была книга Essential JNI . И хотя это несколько устарело, многие из них работают и сегодня.
Если я правильно помню, в C конструкции Java являются просто указателями. Таким образом, в вашем коде « (* env) ->
» - это указатели разыменования, чтобы предоставить вам доступ к базовым методам.
Для C ++ « env
» на самом деле является объект - другая сущность, чем указатель C. (И JNI может фактически предоставить реальные объекты для управления вашим кодом C ++, поскольку C ++ на самом деле поддерживает объекты.) Итак, " env ->
" имеет другое значение в C ++, это означает " вызвать метод, содержащийся в объекте, на который указывает " env
".
Другое отличие, я считаю, состоит в том, что многие функции C-JNI требуют, чтобы один из ваших параметров был " JNIEnv * env
". Таким образом, в C вам, возможно, придется сказать (* env) -> foo (env, bar)
. В C ++ вторая ссылка на « env
» не обязательна, поэтому вместо этого вы можете сказать « env-> foo (bar)
»
К сожалению, у меня нет вышеприведенная книга передо мной, поэтому я не могу это подтвердить! Но я думаю, что изучение этих двух вещей (особенно поиск их в Google или другом коде JNI) поможет вам довольно далеко.
заключается в том, что многие функции C-JNI требуют, чтобы одним из ваших параметров был " JNIEnv * env
". Таким образом, в C вам, возможно, придется сказать (* env) -> foo (env, bar)
. В C ++ вторая ссылка на « env
» не обязательна, поэтому вместо этого вы можете сказать « env-> foo (bar)
»
К сожалению, у меня нет вышеприведенная книга передо мной, поэтому я не могу это подтвердить! Но я думаю, что изучение этих двух вещей (особенно поиск их в Google или другом коде JNI) поможет вам довольно далеко.
заключается в том, что многие функции C-JNI требуют, чтобы одним из ваших параметров был " JNIEnv * env
". Таким образом, в C вам, возможно, придется сказать (* env) -> foo (env, bar)
. В C ++ вторая ссылка на « env
» не обязательна, поэтому вместо этого вы можете сказать « env-> foo (bar)
»
К сожалению, у меня нет вышеприведенная книга передо мной, поэтому я не могу это подтвердить! Но я думаю, что изучение этих двух вещей (особенно поиск их в Google или другом коде JNI) поможет вам довольно далеко.
так что вместо этого вы можете сказать « env-> foo (bar)
»
К сожалению, передо мной нет вышеприведенной книги, поэтому я не могу полностью это подтвердить! Но я думаю, что изучение этих двух вещей (особенно поиск их в Google или другом коде JNI) поможет вам довольно далеко.
так что вместо этого вы можете сказать « env-> foo (bar)
»
К сожалению, передо мной нет вышеприведенной книги, поэтому я не могу полностью это подтвердить! Но я думаю, что изучение этих двух вещей (особенно поиск их в Google или другом коде JNI) поможет вам довольно далеко.
Первый код - правильный C ++, не так ли? Итак, готово!
Серьезно, что вы хотите изменить в этом коде? Почему?
Вы пробовали обернуть свой код C в внешний "C"
. См. C ++ Faq Lite для получения дополнительной информации и других возможных механизмов, позволяющих использовать ваш код C с C ++.
Я давно не касался стандартного C ++, но я все равно попробую.
" (* env) ->
" мне кажется странным. Разве это не должно быть просто « env ->
»?
Может, я ошибаюсь, и это должно работать, но зачем все усложнять?