C# 在ASP.NETMVC中使用DropDownList的最佳编程实践
我和MVC5一起工作了几个月,阅读了很多文章、论坛和文档,但总是想知道在视图中什么更好 1) 使用类模型的静态方法绑定数据 2) 使用ViewData[index]绑定相同的数据,ViewData[index]在控制器中设置,在前面的示例中类似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完全分开。让您的模型包含下拉列表的属性。将其填充到控制器中,然后在视图中绑定它,就像 视图模型
@Html.DropDownListFor(n => n.MyColorId, ViewData[index])
我想说的是,将下拉项与
ViewData
完全分开。让您的模型包含下拉列表的属性。将其填充到控制器中,然后在视图中绑定它,就像
视图模型
您希望使用选项1,主要是因为您希望尽可能多地使用强类型,并在编译时修复错误 相反,ViewData和ViewBag是动态的,编译在运行时之前无法捕获错误 以下是我在许多应用程序中使用的示例代码- 模型
公共类样本模型
{
公共字符串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"}
};
}
}