C# 在ASP.NETMVC中使用DropDownList的最佳编程实践

C# 在ASP.NETMVC中使用DropDownList的最佳编程实践,c#,asp.net-mvc,C#,Asp.net Mvc,我和MVC5一起工作了几个月,阅读了很多文章、论坛和文档,但总是想知道在视图中什么更好 1) 使用类模型的静态方法绑定数据 2) 使用ViewData[index]绑定相同的数据,ViewData[index]在控制器中设置,在前面的示例中类似 @Html.DropDownListFor(n => n.MyColorId, ViewData[index]) 我想说的是,将下拉项与ViewData完全分开。让您的模型包含下拉列表的属性。将其填充到控制器中,然后在视图中绑定它,就像 视图模型

我和MVC5一起工作了几个月,阅读了很多文章、论坛和文档,但总是想知道在视图中什么更好

1) 使用类模型的静态方法绑定数据

2) 使用ViewData[index]绑定相同的数据,ViewData[index]在控制器中设置,在前面的示例中类似

@Html.DropDownListFor(n => n.MyColorId, ViewData[index])

我想说的是,将下拉项与
ViewData
完全分开。让您的模型包含下拉列表的属性。将其填充到控制器中,然后在视图中绑定它,就像

视图模型
您希望使用选项1,主要是因为您希望尽可能多地使用强类型,并在编译时修复错误

相反,ViewDataViewBag是动态的,编译在运行时之前无法捕获错误

以下是我在许多应用程序中使用的示例代码-

模型
公共类样本模型
{
公共字符串SelectedColorId{get;set;}
公共IList可用颜色{get;set;}
公共样本模型()
{
AvailableColors=新列表();
}
}
看法
@model DemoMvc.Models.SampleModel
@使用(Html.BeginForm(“索引”、“主页”))
{
@DropDownListFor(m=>m.SelectedColorId,Model.AvailableColors)
}
控制器
公共类HomeController:控制器
{
公共行动结果索引()
{
var模型=新样本模型
{
AvailableColors=GetColorListItems()
};
返回视图(模型);
}
[HttpPost]
公共行动结果索引(样本模型)
{
if(ModelState.IsValid)
{
var colorId=model.SelectedColorId;
返回视图(“成功”);
}
//如果我们走到这一步,有些东西失败了,重新显示形式
//**重要提示:再次填写可用颜色;否则,DropDownList将为空**
model.AvailableColors=GetColorListItems();
返回视图(模型);
}
私有IList GetColorListItems()
{
//这可能来自数据库。
返回新列表
{
新建SelectListItem{Text=“Orange”,Value=“1”},
新建SelectListItem{Text=“Red”,Value=“2”}
};
}
}

老实说,如果你重构模型,我会选择让编译器大喊大叫的选项
ViewData[index]
在这种情况下更为脆弱。但ViewBag/ViewData的一个优点是,您不必在模型类中引用System.Web.Mvc(对于SelectListItem)。您可能希望将模型类作为DAL和存储库之间的桥梁分开,而不需要了解任何关于ASP.NETMVC的知识。你可以通过将“AvailableColors”改为一本字典,然后在页面上选择一个列表,这也不是特别吸引人。如果在模型“a”中,我只需要模型“B”的ID,为什么我要保留所有模型“B”的集合?@DespeiL,我给出了一个示例代码来说明我在说什么。其目的是作为控制器操作的一部分获取下拉数据,在视图中,您只需将其绑定,仅此而已。您不能将
绑定到
IEnumerable
-模型需要单独的属性(例如
int-SelectedItem
)进行绑定。
class MyModel
{
    public IEnumerable<SelectListItem> dropdowndata {get; set;}
}
public Actionresult MyAction(string id)
{
     IEnumerable<data> mydata = callDALmethodtogetit();
     Mymodel model = new MyModel 
                     {
                        dropdowndata = mydata.Select(c => new SelectListItem 
                                                       { 
                                                          Value = c.Id.ToString(), 
                                                          Text = c.Name 
                                                       });
                     }
 }
@Html.DropDownListFor(model => model.dropdowndata, Model.dropdowndata)
public class SampleModel
{
    public string SelectedColorId { get; set; }
    public IList<SelectListItem> AvailableColors { get; set; }

    public SampleModel()
    {
        AvailableColors = new List<SelectListItem>();
    }
}
@model DemoMvc.Models.SampleModel
@using (Html.BeginForm("Index", "Home"))
{
    @Html.DropDownListFor(m => m.SelectedColorId, Model.AvailableColors)
    <input type="submit" value="Submit"/>

}
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new SampleModel
        {
            AvailableColors = GetColorListItems()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SampleModel model)
    {
        if (ModelState.IsValid)
        {
            var colorId = model.SelectedColorId;
            return View("Success");
        }
        // If we got this far, something failed, redisplay form
        // ** IMPORTANT : Fill AvailableColors again; otherwise, DropDownList will be blank. **
        model.AvailableColors = GetColorListItems();
        return View(model);
    }

    private IList<SelectListItem> GetColorListItems()
    {
        // This could be from database.
        return new List<SelectListItem>
        {
            new SelectListItem {Text = "Orange", Value = "1"},
            new SelectListItem {Text = "Red", Value = "2"}
        };
    }
}