Asp.net mvc ASP.Net MVC 3 Html.DropDown未绑定到变量

Asp.net mvc ASP.Net MVC 3 Html.DropDown未绑定到变量,asp.net-mvc,drop-down-menu,Asp.net Mvc,Drop Down Menu,我有一个组织列表(CalledOrganizationSelectList),其中一个就是被调用的组织(CalledOrganizationId)。我在ViewModel中设置了这两个属性,但MVC/Razor没有正确呈现下拉列表(即没有为下拉列表中的正确项目设置selected=“selected”属性) 还有一种解决办法,它甚至没有什么意义。我在ViewModel中添加了一个新成员,并将下拉列表绑定到该成员。这个很好用。直到现在它停止工作 public class CallViewModel

我有一个组织列表(CalledOrganizationSelectList),其中一个就是被调用的组织(CalledOrganizationId)。我在ViewModel中设置了这两个属性,但MVC/Razor没有正确呈现下拉列表(即没有为下拉列表中的正确项目设置selected=“selected”属性)

还有一种解决办法,它甚至没有什么意义。我在ViewModel中添加了一个新成员,并将下拉列表绑定到该成员。这个很好用。直到现在它停止工作

public class CallViewModel{
public int? CalledOrganizationId { get; set; }        
public SelectList CalledOrganizationSelectList { get; set; }}
在我的控制器中:

var vm = new CallViewModel();
var calledOrganizationSelectList = new List<object>();
calledOrganizationSelectList.Add( new {Text="",Id=""});
calledOrganizationSelectList.AddRange(
db.MyOrganizations.OrderBy(x=>x.Name)
  .Select(x => new { Text = x.Name, Id =     x.Id.ToString()}).ToList());
var sl = new SelectList(calledOrganizationSelectList, "Id", "Text",
  vm.CalledOrganizationId);
vm.CalledOrganizationSelectList = sl;
return View(vm);
var vm=new CallViewModel();
var calledOrganizationSelectList=新列表();
calledOrganizationSelectList.Add(新的{Text=”“,Id=”“});
calledOrganizationSelectList.AddRange(
db.MyOrganizations.OrderBy(x=>x.Name)
.Select(x=>new{Text=x.Name,Id=x.Id.ToString()}).ToList());
var sl=新的选择列表(被调用的组织选择列表,“Id”,“文本”,
vm.CalledOrganizationId);
vm.CalledOrganizationSelectList=sl;
返回视图(vm);
我认为:

<div>CalledOrganizationId = @Model.CalledOrganizationId : 
select list contains
<ul>@foreach (var itm in Model.CalledOrganizationSelectList)
  {<li>Value: @itm.Value Text: @itm.Text Is Selected: @itm.Selected</li>}
</ul>
</div>
@Html.DropDownList("CalledOrganizationId", Model.CalledOrganizationSelectList)
CalledOrganizationId=@Model.CalledOrganizationId:
选择列表包含
    @foreach(模型中的变量itm.CalledOrganizationSelectList) {
  • Value:@itm.Value Text:@itm.Text已选中:@itm.Selected
  • }
@DropDownList(“CalledOrganizationId”,Model.CalledOrganizationSelectList)
在我的呈现页面源中:

<div>CalledOrganizationId = 38 : select list contains     
<ul>
<li>Value:  Text:  Is Selected: False</li>
<li>Value: 37 Text: rrr Is Selected: False</li>
<li>Value: 38 Text: sss1 Is Selected: True</li>
</ul>
</div>
<select data-val="true" data-val-number="The field CalledOrganizationId must be a number." id="CalledOrganizationId" name="CalledOrganizationId">
<option selected="selected" value=""></option> 
<option value="37">rrr</option> 
<option value="38">sss1</option> </select>
CalledOrganizationId=38:选择列表包含
  • 值:文本:已选择:False
  • 值:37文本:已选择rrr:False
  • 值:38文本:已选择sss1:真
存款准备金率 sss1

我先拔出头发上剩下的部分,然后在我的ViewModel上引入一个新变量,这似乎可以解决这个问题。

在ViewModel上有两个属性是进行下拉列表的正确方法。一个属性包含所有可用选项,另一个属性包含当前选定的选项:

public class CallViewModel
{
    // this captures the selected item
    public int? CalledOrganizationId { get; set; }

    // this contains the select list options     
    public IEnumerable<SelectListItem> CalledOrganizationSelectList { get; set; }
}
您只需在控制器中执行以下操作即可:

var vm = new CallViewModel();
//var calledOrganizationSelectList = new List<object>();
//calledOrganizationSelectList.Add( new {Text="",Id=""});
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name)
//  .Select(x => new { Text = x.Name, Id =     x.Id.ToString()}).ToList());
//var sl = new SelectList(calledOrganizationSelectList, "Id", "Text",
//  vm.CalledOrganizationId);
//vm.CalledOrganizationSelectList = sl;
vm.CalledOrganizationSelectList = db.MyOrganizations.OrderBy(x => x.Name)
    .Select(x => new SelectListItem 
    {
        Text = x.Name, 
        //Id = x.Id.ToString()  // do not use "Id" for the property name,
        Value = x.Id.ToString() // use "Value" -- it is a SelectListItem property
    });

// if you want to set the selected item on the dropdownlist, do it here
vm.CalledOrganizationId = 37;

return View(vm);
var vm=new CallViewModel();
//var calledOrganizationSelectList=新列表();
//calledOrganizationSelectList.Add(新的{Text=”“,Id=”“});
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name)
//.Select(x=>new{Text=x.Name,Id=x.Id.ToString()}).ToList());
//var sl=新的选择列表(被调用的组织选择列表,“Id”,“文本”,
//vm.CalledOrganizationId);
//vm.CalledOrganizationSelectList=sl;
vm.CalledOrganizationSelectList=db.MyOrganizations.OrderBy(x=>x.Name)
.选择(x=>new SelectListItem
{
Text=x.名称,
//Id=x.Id.ToString()//不要将“Id”用作属性名,
Value=x.Id.ToString()//使用“Value”--它是SelectListItem属性
});
//如果要在dropdownlist上设置所选项目,请在此处进行设置
vm.CalledOrganizationId=37;
返回视图(vm);

在viewmodel上有两个属性是进行下拉列表的正确方法。一个属性包含所有可用选项,另一个属性包含当前选定的选项:

public class CallViewModel
{
    // this captures the selected item
    public int? CalledOrganizationId { get; set; }

    // this contains the select list options     
    public IEnumerable<SelectListItem> CalledOrganizationSelectList { get; set; }
}
您只需在控制器中执行以下操作即可:

var vm = new CallViewModel();
//var calledOrganizationSelectList = new List<object>();
//calledOrganizationSelectList.Add( new {Text="",Id=""});
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name)
//  .Select(x => new { Text = x.Name, Id =     x.Id.ToString()}).ToList());
//var sl = new SelectList(calledOrganizationSelectList, "Id", "Text",
//  vm.CalledOrganizationId);
//vm.CalledOrganizationSelectList = sl;
vm.CalledOrganizationSelectList = db.MyOrganizations.OrderBy(x => x.Name)
    .Select(x => new SelectListItem 
    {
        Text = x.Name, 
        //Id = x.Id.ToString()  // do not use "Id" for the property name,
        Value = x.Id.ToString() // use "Value" -- it is a SelectListItem property
    });

// if you want to set the selected item on the dropdownlist, do it here
vm.CalledOrganizationId = 37;

return View(vm);
var vm=new CallViewModel();
//var calledOrganizationSelectList=新列表();
//calledOrganizationSelectList.Add(新的{Text=”“,Id=”“});
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name)
//.Select(x=>new{Text=x.Name,Id=x.Id.ToString()}).ToList());
//var sl=新的选择列表(被调用的组织选择列表,“Id”,“文本”,
//vm.CalledOrganizationId);
//vm.CalledOrganizationSelectList=sl;
vm.CalledOrganizationSelectList=db.MyOrganizations.OrderBy(x=>x.Name)
.选择(x=>new SelectListItem
{
Text=x.名称,
//Id=x.Id.ToString()//不要将“Id”用作属性名,
Value=x.Id.ToString()//使用“Value”--它是SelectListItem属性
});
//如果要在dropdownlist上设置所选项目,请在此处进行设置
vm.CalledOrganizationId=37;
返回视图(vm);

我对DropDownList中的选定项目有问题。如果以上的答案无济于事,请考虑一下。谢谢你那些非常及时和有益的回答。它仍然不起作用,但至少我知道我没有发疯。现在我已经添加了一些jquery来设置页面加载后的下拉列表。。。这看起来像这样$(函数(){var calledOrganizationId=@(Model.calledOrganizationId==null?“null”:Model.calledOrganizationId.ToString());$(“#calledOrganizationId”).val(calledOrganizationId);});我对dropdownlists中的选定项目有问题。如果以上的答案无济于事,请考虑一下。谢谢你那些非常及时和有益的回答。它仍然不起作用,但至少我知道我没有发疯。现在我已经添加了一些jquery来设置页面加载后的下拉列表。。。这看起来像这样$(函数(){var calledOrganizationId=@(Model.calledOrganizationId==null?“null”:Model.calledOrganizationId.ToString());$(“#calledOrganizationId”).val(calledOrganizationId);});