【问题标题】:ASP.Net Core MVC <select> <option> returns nullASP.Net Core MVC <select> <option> 返回 null
【发布时间】:2020-10-15 04:50:23
【问题描述】:

使用 ASP.NET Core MVC 应用程序。我有一个 &lt;select&gt;&lt;option&gt;@model List&lt;CatalogItem&gt; 用于我的 Razor 视图。我想用CatalogItem 项中的值填充表单CartForm。当用户选择一个项目并将其发送回操作方法asp-action="CartForm" 时,所选项目返回为空。

我错过了什么?

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

【问题讨论】:

  • 什么是 HTML 输出?还有:你如何“看到”选中的项目返回null
  • 显示模型中的相关位,以及 POST 操作。

标签: c# asp.net-core-mvc


【解决方案1】:

虽然这并不能解释null的值:

&lt;option&gt;value 必须是字符串,或者至少是简单类型。

您的@itm 是一个复杂类型。

您应该将其更改为:

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

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

【讨论】:

    【解决方案2】:

    正如@Stefan 所说,@itm 是一个复杂类型,我们不能直接在 select 选项值中将它传递给控制器​​。

    如果您仍想根据 select 选项传递项目,我建议您可以尝试使用 CatalogItem 属性为 select 选项设置一些自定义属性,并在视图上添加隐藏字段,隐藏输入的名称是 CatalogItem属性名称。

    然后你可以使用jquery根据下拉列表选择选项设置输入隐藏的值。

    asp.net核心模型绑定会根据formdata的名字来绑定模型,所以会很好的绑定。

    更多细节,你可以参考下面的例子。

    CatalogItem 型号:

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

    查看:

    <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>
    

    jQuery 脚本:

    <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();
    
        }
    

    结果:

    【讨论】:

    • 感谢您的好评。我最初尝试了简化的情况,我只从
    • 默认情况下,我们只会将选择值返回给控制器,因为表单post会根据每个html元素的名称生成表单数据。通常,我们只会发布选择 itemid,然后我们会根据这个 itemid 做一些事情。如果你摔倒了,我的回复对你有帮助。请将其标记为答案,以便其他面临相同问题的人更容易找到解决方案。
    • 谢谢。如果我有其他问题,我将实施建议的更正并回来。
    • 我接受了只返回字符串值 ItemId 的建议。我的困惑是我没有在
      开始标记中引用的操作方法中收到 ItemId 字符串。我不明白如何将所选值从
    【解决方案3】:

    我遇到的空值问题源于我没有在回发方法中命名参数以匹配标签的名称。一旦我将其对齐,一切都会正常工作。
    感谢所有提供他/她的时间和 cmets 的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2010-11-22
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多