Razor ASP.NET MVC 4:为强类型视图上使用的DropdowlistFor选择默认值

Razor ASP.NET MVC 4:为强类型视图上使用的DropdowlistFor选择默认值,razor,asp.net-mvc-4,html.dropdownlistfor,Razor,Asp.net Mvc 4,Html.dropdownlistfor,也许这个问题已经问过了,但我发现答案并不清楚 我想选择下拉列表的默认值。 我有一个国家/地区列表,根据通过Thread.CurrentThread.CurrentCulture检索的地区代码,我想选择用户的国家/地区 是否可以通过我的方法: 查看 @model Question @Html.DropDownListFor(b => b.SelectedAnswer,new SelectList(Model.Answers,"ID","Country")) 型号 public class

也许这个问题已经问过了,但我发现答案并不清楚

我想选择下拉列表的默认值。 我有一个国家/地区列表,根据通过Thread.CurrentThread.CurrentCulture检索的地区代码,我想选择用户的国家/地区

是否可以通过我的方法:

查看

@model Question
@Html.DropDownListFor(b => b.SelectedAnswer,new SelectList(Model.Answers,"ID","Country"))
型号

 public class Question
    {

        public int ID { get; set; }
        public string Country { get; set; }

        public List<Answer> Answers { get; set; }
        [Required]
        public int SelectedAnswer { get; set; }
        public int Order { get; set; }

        public Question()
        {
            Answers = new List<Answer>();
        }
    }
公开课问题
{
公共int ID{get;set;}
公共字符串国家{get;set;}
公共列表答案{get;set;}
[必需]
public int SelectedAnswer{get;set;}
公共整数顺序{get;set;}
公众问题(
{
答案=新列表();
}
}

谢谢。

真的,您应该将下拉列表作为包含SelectListItem的列表传递。然后,对于每个国家,将文本作为国家代码,并在值内为其分配一个id。然后,在初始化模型时,收集区域性,并查找列表中的哪个项目具有匹配的文本

    Thread.CurrentThread.CurrentUICulture.Name; 

并将其value属性指定给SelectedAnswer。

我本来打算将其作为注释添加,但长度太长,这样如果我有帮助,您可以将其作为答案

这是我用来实现这一点的方法

首先,在viewmodel中,我有以下内容

public int FooID { get; set; }
public IEnumerable<SelectListItem> FooList { get; set; }
在输出viewmodel之前,当前值将插入到FooID中,或者如果这是针对新项目的,我通常会将该值设置为1,默认值

然后进行输出

@Html.DropDownListFor(m => m.FooID, Model.FooList)
请记住,FooID将作为字符串传递,因此需要作为字符串FooID参数收集,并转换为Int。只要在从控制器将viewmodel传递到视图之前设置了FooID,那么愚人列表中值等于FooID的项将设置为默认项。。。例如,

public ActionResult MyAction()
    {
        MyVM vm = new MyVM();
        vm.FooID = 1;
        vm.FooList = FunctionToGenerateFooList();

        return View(vm);
    }

您的意思是:@Html.DropDownList(“CountryID”,(IEnumerable)ViewBag.Countries)。我用这个ID做了一个小测试。在控制器中:var query=db.Countries.Select(c=>new{c.CountryID,c.Name});ViewBag.Countries=新选择列表(query.AsEnumerable(),“CountryID”,“Name”,CountryID);但这不起作用。如果我使用的是SelectedAnwser,它的映射不为人所知,如果我使用的是CountryID,在发布过程中它将不会被检索。我想指出的是,我遗漏了一些非常简单的东西(我一开始也是这样做的,我今天早上在查看这个文件时,我完全忘记了我已经更改了它)一个更简单的解决方案是不在GET操作上设置vm.FooID=1,在构建列表时,您可以对默认值执行此操作:new SelectListItem{Text=i.Name,value=i.FooID.ToString(),Selected=true};
public ActionResult MyAction()
    {
        MyVM vm = new MyVM();
        vm.FooID = 1;
        vm.FooList = FunctionToGenerateFooList();

        return View(vm);
    }