我有这个控制器:在Asp.Net MVC 3中处理DropDownListFor的最佳方式是什么?
public ActionResult Novo()
{
var products = context.Product.Select(x => new SelectListItem
{
Text = x.Name,
Value = SqlFunctions.StringConvert((double)x.Id).Trim()
}).ToList();
MyViewModel myViewModel= new MyViewModel()
{
Products = products
};
return View(myViewModel);
}
[HttpPost]
public ActionResult Novo(MyViewModel myViewModel)
{
if (ModelState.IsValid)
{
...
context.SaveChanges();
return RedirectToAction("Index");
} else {
var products = context.Product.Select(x => new SelectListItem
{
Text = x.Name,
Value = SqlFunctions.StringConvert((double)x.Id).Trim()
}).ToList();
MyViewModel myViewModel= new MyViewModel()
{
Products = products
};
return View(myViewModel);
}
}
我必须填充产品在视图模型在这两种方法。
我的视图模型:
public class MyViewModel
{
public IEnumerable<SelectListItem> Products { get; set; }
public string ProductIdSelected { get; set; }
}
我的HTML:
<div class="editor-field">
@Html.DropDownListFor(model => model.ProductIdSelected, Model.Products)
</div>
的问题是在我的控制,我必须来填充视图模型在这两种方法。我不喜欢这样,我不喜欢创建一个方法来填充ViewModel,因为当验证失败时,其他字段保持填充,为什么我的Products字段不会保持填充?我认为使用一种方法很难看。有没有办法避免使用其他方法?
有没有一种方法可以在我的ViewModel中只填充一次Producs,并在某人发布帖子和帖子无效时缓存产品列表。
如果不是,更好的方法是使用另一种方法。谢谢。
“我不喜欢创建一个方法来填充ViewModel。”所以你说的是你不喜欢可重用的代码? – Dismissile
@Dismissile请参阅更新。 –
@Acaz - 如果你不想使用一种方法(我认为这是正确的选择),你将不得不将数据存储在某处*。你可以缓存它(不保证在回发中),你可以以某种方式序列化它,并使用模型联编程序从价值提供者中重新加载。但是,我认为这是对问题的过度分析。只需使用一种方法...它对C#不可或缺! – TheCloudlessSky