C# ASP.Net核心MVC返回空值

C# ASP.Net核心MVC返回空值,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,使用ASP.NET核心MVC应用程序。我的Razor视图有一个带@model的列表。我想用CatalogItem项中的值填充表单CartForm。当用户选择一个项目并将其发送回操作方法asp action=CartForm时,所选项目返回为null 我错过了什么 <select id="itmSelect" name="itmSelect"> foreach (CatalogItem itm in Model) { <option

使用ASP.NET核心MVC应用程序。我的Razor视图有一个带@model的列表。我想用CatalogItem项中的值填充表单CartForm。当用户选择一个项目并将其发送回操作方法asp action=CartForm时,所选项目返回为null

我错过了什么

<select id="itmSelect" name="itmSelect">
foreach (CatalogItem itm in Model)
{
    <option class="text-dark" value="@itm">@itm.Description</option>
}
</select>

尽管这并不能解释空值:

的值必须是字符串,或至少是简单类型

您的@itm是一个复杂类型

您应该将其更改为以下内容:

 <option class="text-dark" value="@itm.ID">

通过更改此选项,您至少可以发布正确的选择值,这可能会更好地反映您的发送模式。

正如@Stefan所说,@itm是一种复杂类型,我们无法在选择选项值中直接将其传递给控制器

如果仍然希望基于选择选项传递项目,我建议您可以尝试使用CatalogItem属性为选择选项设置一些自定义属性,并在视图上添加come hidden字段,隐藏输入的名称为CatalogItem属性名称

然后可以使用jquery根据dropdownlist选择选项设置输入隐藏的值

asp.net核心模型绑定将根据formdata的名称绑定模型,因此绑定良好

更多细节,您可以参考下面的示例

目录项模型:

public class CatalogItem
{
    public int Id { get; set; }
    public string Description { get; set; }

    public string Name { get; set; }

}
视图:

结果:


null值出现的问题是因为我没有在post-back方法中命名参数以匹配标记的名称。一旦我把它对齐,一切都正常了。
感谢每一位提供时间和评论的人。

HTML输出是什么?和:您如何看待所选项目返回空值?显示模型中的相关位,并发布操作。感谢您的精彩回复。我最初尝试了simlified的情况,其中我只从元素返回string ItemId属性。我想我曾经,现在仍然有命名约定不一致。此外,我还可以通过在select的目标操作方法中设置断点来测试null返回值。我很乐意只发送ItemId,因为我可以用C代码解析对象的其余部分并填充另一个视图。默认情况下,我们只将select值返回给控制器,因为表单post将根据每个html元素的名称生成表单数据。通常情况下,我们只需发布并选择itemid,然后根据此itemid执行操作。如果你觉得我的回答帮助了你。请将其标记为答案,以便其他面临相同问题的人更容易找到解决方案。谢谢。我将执行建议的更正,如果我有进一步的问题,我会回来。我接受了只返回字符串值ItemId的建议。我的困惑是,我没有在开始标记中引用的操作方法处收到ItemId字符串。我不明白如何将所选值从元素发送回控制器。
<form asp-action="DropdownGetValue" id="test1">
    <select id="itmSelect" name="Id">
        @foreach (var itm in Model)
        {
            <option class="text-dark" value="@itm.Id" Description="@itm.Description"  Name="@itm.Name">@itm.Description</option>
        }
    </select>
    <input type="hidden" name="Description" id="Description" />
    <input type="hidden" name="Name" id="Name" />
    <input type="submit" value="Click" />
</form>
<script type="text/javascript">
    $(function () {
        $("#itmSelect").change(function () {
            $("#Description").val($('#itmSelect').find(":selected").attr("Description"));  
            $("#Name").val($('#itmSelect').find(":selected").attr("Name"));  
        });
    })

</script>
    [HttpPost]
    public IActionResult DropdownGetValue(CatalogItem itmSelect)
    {
        //_db.Category.Add(ca);
        //_db.SaveChanges();
        int i = 0;
        return Ok();

    }