【问题标题】:Model does not have values for ListBoxFor in MVC4模型在 MVC4 中没有 ListBoxFor 的值
【发布时间】:2012-12-28 20:59:57
【问题描述】:

我能够在 ListBoxFor 控件中显示从控制器到视图的值。但是,当我将值从一个列表框移动到另一个列表框并发布视图时,控制器端的模型不会保留列表框中的值。

这是我的模型

namespace MvcApplication1.Models
{
  public class EmployeeClass
  {
    public int EmpCode { get; set; }
    public string EmpName { get; set; }
  }

   public class EmployeeViewModel
  {
    public string Department { get; set; }
    public list<EmployeeClass> AvailalableEmployee { get; set; }
    public list<EmployeeClass> SelectedEmployee { get; set; }

    public int [] AvailableEmpCodeArray { get; set; }
    public int [] SelectedEmpCodeArray { get; set; }
  }
}

这是我的控制器

namespace MvcApplication1.Controllers
{
    public class EmployeeController : Controller
    {
        public ActionResult EmployeeDisplayTool()
        {   
            EmployeeViewModel model = new EmployeeViewModel();

            model.Department = "Techology"
            model.AvailalableEmployee.Add(new Employee(1,"Emp1"));
            model.AvailalableEmployee.Add(new Scenario(2,"Emp2"));
            model.AvailalableEmployee.Add(new Scenario(3,"Emp3"));

            model.SelectedEmployee.Add(new Scenario(4,"Emp4"));
            model.SelectedEmployee.Add(new Scenario(5,"Emp5"));
            model.SelectedEmployee.Add(new Scenario(6,"Emp6"));
            return View(model);
        }
        [HttpPost]
        public ActionResult EmployeeDisplayTool(EmployeeViewModel model)
        {
            //model.Department is populated as "Technology"

            //All of the follownig collections are null.
            //model.AvailalableEmployee is null.
            //model.AvailableEmpCodeArray is null.

            //model.SelectedEmployee is null.
            //model.SelectedEmpCodeArray is null.
        }
    }
}

这是我的视图和 JavaScript

@using (Html.BeginForm())
{
<table id="MainTable" border="0">  
<tr>
    <td colspan="3">
        @Html.TextBoxFor(m => Model.Department, new { id = "txtDepartment" })
    </td>
</tr>
<tr>     
    <td>
       @Html.ListBoxFor(m => Model.AvailableEmpCodeArray, new MultiSelectList(Model.AvailalableEmployee, "EmpCode", "EmpName", Model.AvailableEmpCodeArray), new { id = "lbxAvailableEmployees" })
    </td>         
    <td>
        <input type="button" id="btnSelectEmployee" value=" >> "/>
        <br/>
        <br/>
        <input type="button" id="btnUnSelectEmployee" value=" << "/>
    </td>
    <td>
         @Html.ListBoxFor(m => Model.SelectedEmpCodeArray, new MultiSelectList(Model.SelectedEmployee, "EmpCode", "EmpName", Model.SelectedEmpCodeArray), new { id = "lbxSelectedEmployees" })
    </td>         
</tr> 
</table>
}

<script type="text/javascript">
    $(document).ready(function() 
    {  
        $('#btnSelectEmployee').click(function(e) 
        { 
            var SelectedEmps = $('#lbxAvailableEmployees option:selected');  
            if (SelectedEmps.length == 0) 
            {  
                e.preventDefault();
            }
            $('#lbxSelectedEmployees').append($(SelectedEmps).clone());  
            $(SelectedEmps).remove();  
            e.preventDefault();  
        });  

        $('#btnUnSelectEmployee').click(function(e) 
        {  
            var SelectedEmps = $('#lbxSelectedEmployees option:selected');  
            if (SelectedEmps.length == 0) 
            {  
                e.preventDefault();  
            }  
            $('#lbxAvailableEmployees').append($(SelectedEmps).clone());  
            $(SelectedEmps).remove();  
            e.preventDefault();
        });  

    });
</script>

【问题讨论】:

    标签: c# jquery asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    在您的HttpPost 操作中,您不能期望填充AvailalableEmployeeSelectedEmployee 集合。这是由于 HTML 的工作原理。提交表单时,只有选定的值会发送到服务器。当您提交表单时,选择字段的文本值从不发送到您的服务器。

    因此,您希望在此 HttpPost 操作中填充的只是 AvailableEmpCodeArraySelectedEmpCodeArray 集合。它们将包含相应选择字段中选定项的值。请注意,我已将 selected 加粗。这意味着只有当您选择相应框中的任何项目时,这些集合才会被绑定。如果您不选择任何内容,它们将保持为空,这是完全正常的。

    这是一个没有选择任何内容的用户示例。他只是使用&lt;&lt;&gt;&gt; 按钮来切换列表之间的值,但请注意绝对没有选择:

    注意如何选择nothing?这就是您在控制器操作中获得的全部内容 - 什么都没有

    现在请对比下面的截图:

    你看出区别了吗?请注意用户如何明确选择Emp2Emp5Emp6 值(使用Shift 键选择多个值)?这就是您要在 HttpPost 操作中获得的内容。 AvailableEmpCodeArray 集合将包含一个值为2 的元素,SelectedEmpCodeArray 将包含两个值为56 的元素。

    现在你的第二个问题。如果您打算从 HttpPost 控制器操作中重新显示相同的视图,您需要确保的第一件事是您已将值分配给 AvailalableEmployeeSelectedEmployee 集合。这应该与您在 HttpGet 操作中所做的相同:

    model.AvailalableEmployee.Add(new Employee(1,"Emp1"));
    model.AvailalableEmployee.Add(new Scenario(2,"Emp2"));
    model.AvailalableEmployee.Add(new Scenario(3,"Emp3"));
    
    model.SelectedEmployee.Add(new Scenario(4,"Emp4"));
    model.SelectedEmployee.Add(new Scenario(5,"Emp5"));
    model.SelectedEmployee.Add(new Scenario(6,"Emp6"));
    

    或者如果这些值来自数据库,您将不得不在 HttpPost 操作中重新查询该数据库,因为正如我已经解释的那样,这些值永远不会从视图中绑定。

    【讨论】:

    • 感谢 Darine 的快速回复。如何获取存储在两个列表框中的值?用户将从一个列表框中选择值到另一个列表框,然后在单击提交按钮之前执行其他操作。
    • 如果您希望将这些值发送到您的服务器,用户必须选择这些值。这就是 HTML 的工作原理,请学习 HTML 的基础知识。如果用户没有选择任何东西,无论你在选择框之间切换它们,什么都不会被发送到服务器。我会用截图更新我的答案,让你明白我的意思。
    • 是的,我是 HTML 新手,正在学习 HTML 的基础知识...有没有其他方法可以在控制器中获取值?
    • 我已经用截图更新了我的答案。希望你现在明白了。您必须选择要发送到服务器的值。这就是 HTML 的工作原理。此外,如果您是 HTML 新手,我强烈建议您前往w3.org 站点,甚至在进入 ASP.NET MVC 之前就开始学习它。如果您不了解 HTML 的基础知识,那么您真的不需要在 ASP.NET MVC 上浪费时间,因为您会发现很多东西很奇怪,而且您很难理解它们。
    • 谢谢达林....在我的情况下,值在移动时被选中,但随后用户可以执行其他操作,例如修改部门名称,取消选择其他一些值。当用户单击提交时,更改应保存到数据库中。为了做到这一点,我需要知道列表框和更改列表中的原始值列表......所以看起来我必须找到其他方法来做到这一点。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2014-06-15
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多