Ответ на исходный вопрос
Почему я получаю эту ошибку
blockquote>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 из списка выбора и создайте свойство для получения выбранного значения.Ответ на вопрос в вашем редактировании
Теперь я получаю сообщение об ошибке
blockquote>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>
Лично я предпочитаю RelaxNG , а не XML-схему. Может быть, стоит потратить на это время.
Следующее должно сделать трюк. Со стандартом XSD довольно сложно работать напрямую, я всегда использую такой редактор, как Liquid XML Studio .
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Path" type="PathType" />
<xs:complexType name="PathType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Path" type="PathType" />
</xs:sequence>
<xs:attribute name="expr" type="xs:string" use="required" />
</xs:complexType>
</xs:schema>
(источник: liquid-technologies.com )
XSD действует. Для нового XML, который вы описали, вам нужно изменить его так, чтобы он выглядел следующим образом.
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.0.1135 (http://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application">
<xs:complexType>
<xs:sequence>
<xs:element name="path" type="PathType" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:complexType name="PathType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="path" type="PathType" />
</xs:sequence>
<xs:attribute name="expr" type="xs:string" use="required" />
</xs:complexType>
</xs:schema>