Окрасьте логический алгоритм

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

24
задан BlueRaja - Danny Pflughoeft 20 January 2010 в 17:51
поделиться

6 ответов

вот это теоретическое объяснение

и альго в C:

typedef struct {
    unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
    long rmean = ( (long)e1.r + (long)e2.r ) / 2;
    long r = (long)e1.r - (long)e2.r;
    long g = (long)e1.g - (long)e2.g;
    long b = (long)e1.b - (long)e2.b;
    return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
42
ответ дан 28 November 2019 в 17:50
поделиться

Вот алгоритм pgras в Java:

public double ColourDistance(Color c1, Color c2)
{
    double rmean = ( c1.getRed() + c2.getRed() )/2;
    int r = c1.getRed() - c2.getRed();
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    double weightR = 2 + rmean/256;
    double weightG = 4.0;
    double weightB = 2 + (255-rmean)/256;
    return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
} 
26
ответ дан Alp 16 October 2019 в 07:42
поделиться

С точки зрения алгоритма это довольно просто. Каждый цвет представляет точку в трехмерном пространстве, а разница между цветами - это расстояние между этими точками.

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

Просто для удовольствия вы можете взглянуть на онлайн-тест цветового зрения X-rite .

2
ответ дан Jerry Coffin 16 October 2019 в 07:42
поделиться

Большинство ответов на этот вопрос предложат вычислению расстояния между двумя цветами при сопоставлении значений RGB в трехмерное пространство. Проблема с этой техникой заключается в том, что два цвета с аналогичными оттенками, но различные уровни насыщения или яркости могут отображаться дальше друг от друга в 3D RGB пространства RGB, чем два цвета с различными оттенками, но очень аналогичные уровни насыщения и яркости. Другими словами, синий и зеленый может быть ближе в 3D RGB пространства RGB, чем два оттенка красного. В этом приложении обеспечение цветов команды различаются, оттенок оттенок должна весить гораздо более сильно, чем яркости и насыщенность.

Итак, я бы преобразую отображение цвета от RGB в оттенок, насыщенность и уровень яркости, а затем проверяйте только значения оттенка для достаточного расстояния.

У Википедии есть объяснение для преобразования RGB в HSV. Литературограммы имеют какой-то выборки.

5
ответ дан 28 November 2019 в 17:50
поделиться

Wikipedia имеет детали по ряду алгоритмов, которые могут быть использованы для этого.

Существует также этот предыдущий вопрос стойки: Найти точное «расстояние» между цветами

4
ответ дан 28 November 2019 в 17:50
поделиться

Я бы использовал 3D расстояние между двумя цветами, где X, Y, Z представляет собой R, G, B значения.

Посмотрите на эту библиотеку Perl:

http://metacpan.org/pod/color::sImilerity ::rgb

Это легко реализовать себя.

Просто убедитесь, что (R1-R2) ^ 2 + (G1-G2) ^ 2 + (B1-B2) ^ 2> = порог ^ 2

5
ответ дан 28 November 2019 в 17:50
поделиться
Другие вопросы по тегам:

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