我使用MVC 5几个月阅读了很多文章,论坛和文档,但总是想知道视图中哪个更好;
1)使用here
等模型的静态方法绑定数据2)使用在Controller中设置的ViewData [index]绑定相同的数据,前面的示例将如下所示
@Html.DropDownListFor(n => n.MyColorId, ViewData[index])
答案 0 :(得分:7)
您想使用选项1,主要是因为您希望尽可能使用强类型,并在编译时修复错误。
相比之下, ViewData 和 ViewBag 是动态的,并且在运行时编译无法捕获错误。
以下是我在许多应用程序中使用的示例代码 -
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"}
};
}
}
答案 1 :(得分:2)
我想说,完全将ViewData
的下拉项目分开。让您的模型包含下拉属性。在控制器中填写它,然后在视图中绑定它,如
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)