SelectList при ошибке привязки модели страницы Razor

Пожалуйста, попробуйте простой код следующим образом:

from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()

Перед тем, как вы нарисуете, вам нужно установить размер фигуры.

0
задан pretzelb 2 March 2019 в 16:10
поделиться

2 ответа

Похоже, проблема была в том, как были определены SelectList и SelectListItems. В режиме отладки они выглядели нормально, но я думаю, что проблема была в том, когда рендеринг пытался произойти. Вот что сработало. Обратите внимание на изменение, когда я добавил определения Text и Value для элементов, а затем скопировал их при загрузке списка. Также обратите внимание, что мне пришлось использовать связанное поле, чтобы сохранить выбор пользователя после публикации. Мне действительно любопытно, как это не было нужно в примере Razor, на который я ссылался .

public TestSelectModel()
{
    _searchoptions = new List<SelectListItem>();
    _searchoptions.Add(new SelectListItem() { Text = "By Email", Value = "1", Selected = true });
    _searchoptions.Add(new SelectListItem() { Text = "By Request Name", Value = "2", Selected = false });
}
public void OnGet()
{
    if(BoundSearchField is null)
    {
        BoundSearchField = "1";
    }
    SearchOptions = new SelectList(_searchoptions, "Value", "Text", BoundSearchField);
}
0
ответ дан pretzelb 2 March 2019 в 16:10
поделиться

Ответ на исходный вопрос

Почему я получаю эту ошибку InvalidOperationException: Could not create an instance of type 'Microsoft.AspNetCore.Mvc.Rendering.SelectList'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, set the 'SearchOptions' property to a non-null value

Имеет атрибут BindProperty в вашем свойстве SearchOptions попытается привязать данные заголовка к вашему SelectList. Удалите атрибут BindPropery из списка выбора и создайте свойство для получения выбранного значения.

Ответ на вопрос в вашем редактировании

Теперь я получаю сообщение об ошибке NullReferenceException: Object reference not set to an instance of an object

Это потому, что "Key" должно быть "Text"

Измените SearchOptions = new SelectList(_searchoptions, "Key", "Value", "By Email");
на SearchOptions = new SelectList(_searchoptions, "Text", "Value", "By Email");

Полный код:

private List<SelectListItem> _searchoptions;

// [BindProperty(SupportsGet = true)] // Remove this here
public SelectList SearchOptions { get; set; }

// Add a property to receive your selected value
[BindProperty(SupportsGet = true)]
public string BoundSearchField { get; set; }

public TestSelectModel()
{
    _searchoptions = new List<SelectListItem>();
    _searchoptions.Add(new SelectListItem("By Email", "By Email", true));
    _searchoptions.Add(new SelectListItem("By Request Name", "By Request Name", false));
}
public void OnGet()
{
    // Change "Key" to "Text"
    SearchOptions = new SelectList(_searchoptions, "Text", "Value", "By Email");
}

Затем добавьте name="BoundSearchField" в свой .cshtml

<form>
    <div>
        <select name="BoundSearchField" asp-items="Model.SearchOptions">
            <option value="">Choose an search method</option>
        </select>
        <input type="submit" value="Filter" />
    </div>
</form>
0
ответ дан Jerry 2 March 2019 в 16:10
поделиться
Другие вопросы по тегам:

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