Вызовы JNI разные в C против C ++?

Ошибка означает, что значение 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}'.

30
задан Petey B 1 June 2009 в 15:42
поделиться

4 ответа

Раньше у меня была книга 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) поможет вам довольно далеко.

26
ответ дан 27 November 2019 в 22:37
поделиться

Первый код - правильный C ++, не так ли? Итак, готово!

Серьезно, что вы хотите изменить в этом коде? Почему?

-1
ответ дан 7 July 2019 в 19:59
поделиться

Вы пробовали обернуть свой код C в внешний "C" . См. C ++ Faq Lite для получения дополнительной информации и других возможных механизмов, позволяющих использовать ваш код C с C ++.

5
ответ дан 27 November 2019 в 22:37
поделиться

Я давно не касался стандартного C ++, но я все равно попробую.

" (* env) -> " мне кажется странным. Разве это не должно быть просто « env -> »?

Может, я ошибаюсь, и это должно работать, но зачем все усложнять?

2
ответ дан 27 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: