【问题标题】:MVC DropDownListFor Null ValuesMVC DropDownListFor Null 值
【发布时间】:2013-04-17 11:14:23
【问题描述】:

我在 MVC 中使用 htmlhelper 的下拉列表时遇到问题。当回发发生时,没有选择任何内容,并且列表的模型中的值,并且选定的项目为空。

这是我的模型:

namespace MvcTestWebApp.Models
{
    public class Customer
    {
        public string name { get; set; }

        public List<SelectListItem> members { get; set; }

        public Member selected { get; set; }
    }

    public class Member
    {
        public string name { get; set; }

    }
}

控制器:

namespace MvcTestWebApp.Models
{
    public class CustomerController : Controller
    {
        //
        // GET: /Customer/
        public ActionResult Index()
        {
            Customer cust = new Customer() { name = "Cust1" };
            cust.members = new List<SelectListItem>();

            cust.members.Add(new SelectListItem(){Text = "Bob"} );
            cust.members.Add(new SelectListItem(){Text = "Dave"} );

            return View(cust);
        }

        [HttpPost]
        public ActionResult Index(Customer customer)
        {

           return View();
        }


    }
}

并查看:

    @model MvcTestWebApp.Models.Customer

@{
    ViewBag.Title = "Customer";
    Layout = null;
}

<!DOCTYPE html>

<html>

<head>
    <meta name="viewport" content="width=device-width" />
    <title> Index </title>
</head>

    <body>


@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Customer Data</legend>

          @Html.HiddenFor(model => model.name)

          @Html.DropDownListFor(model => model.selected, Model.members, "--Select--")

        <p>
            <input type="submit" value="Save" />
        </p>

        </fieldset> 
}

    </body>

</html>

当我从选择列表中选择某些内容并单击提交按钮时,将返回空值:

谁能解释我做错了什么?

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    您遇到的问题是 MVC 不知道如何将下拉列表的选定值(这是一个字符串)转换为对象成员。

    你应该做的是有一个 selectedValue 属性,用于设置下拉列表中的值并检索返回值。

    新客户类别:

    public class Customer
    {
      public string name { get; set; }
    
      public List<SelectListItem> members { get; set; }
    
      public string selectedValue { get; set; }
    
      public Member selected { get; set; }
    }
    

    更新下拉列表控件:

    @Html.DropDownListFor(model => model.selectedValue, Model.members, "--Select--")
    

    这将从下拉列表中选择的值返回到属性 selectedValue。

    您的成员列表返回 null 的原因是因为 HTML 不返回下拉列表中的选项,它只返回选定的值。所以当信息进入方法时,只给出输入表单的值。

    如果您想查看哪些信息被发送回服务器,您可以使用开发者控制台并捕获返回的 Http 请求

    和/或

    您可以将FormCollection collection 添加到控制器操作的参数中,以查看 MVC 使用什么信息来构建它传递给方法的对象。

    [HttpPost]
    public ActionResult Index(Customer customer, FormCollection collection)
    {
    
      return View();
    }
    

    【讨论】:

    • +1 表示“您可以将 FormCollection 集合添加到控制器操作的参数中,以查看 MVC 使用什么信息来构建它传递给方法的对象。”我不小心为另一个表单设置了属性表单,我想了几个小时,我的 DropDownListFor 不想返回 Guid... FormCollection 告诉我,问题是表单而不是模型
    【解决方案2】:
    cust.members.Add(new SelectListItem(){Text = "Bob"} );
    cust.members.Add(new SelectListItem(){Text = "Dave"} );
    

    尝试设置值:

    cust.members.Add(new SelectListItem(){Value = "Bob", Text = "Bob"} );
    cust.members.Add(new SelectListItem(){Value = "Dave", Text = "Dave"} );
    

    【讨论】:

    • 不行还是不行。很好的尝试 :) 我认为这可能是在打脸后完成的,但不行,它仍然是空的。我还尝试将 cust.selected 更改为 SelectListItem,但这也不起作用。
    • @ChristopherTownsend 更改助手属性 @Html.DropDownListFor(model =&gt; model.selected.name, Model.members, "--Select--") 并在 GET 操作中创建对象 new Customer() { name = "Cust1", selected = new Member() }
    【解决方案3】:

    使用 jQuery prepend 轻松解决问题。

    $("#idOfSelectTag").prepend('
                                  <option selected="selected" value="null">
                                    -- Select School --
                                  </option>
                                ');
    

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 1970-01-01
      • 2017-05-08
      • 2014-06-29
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多