我有这个控制器:
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);
}
}
我必须使用这两种方法在ViewModel中填充产品。
我的ViewModel:
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>
问题出在我的Controller中,我必须在这两种方法中填充ViewModel。我不喜欢这样,我不喜欢创建一个方法来填充ViewModel,因为当验证失败时,其他字段会保持填充状态,为什么我的Products字段也不会被填充?我认为使用一种方法很难看。有没有办法避免使用其他方法?
有没有办法只在我的ViewModel中填充一次Producs,并在有人发帖并且帖子无效时缓存产品列表。
如果不是,更好的方法是使用另一种方法。感谢。
答案 0 :(得分:0)
创建单独的方法来填充VM(对于GET和验证失败时的POST
)有什么问题?
[HttpGet]
public ActionResult Novo()
{
MyViewModel myViewModel= new MyViewModel();
this.LoadProducts(myViewModel);
return View(myViewModel);
}
[HttpPost]
public ActionResult Novo(MyViewModel myViewModel)
{
if (ModelState.IsValid)
{
...
context.SaveChanges();
return RedirectToAction("Index");
}
else
{
MyViewModel myViewModel= new MyViewModel();
this.LoadProducts(myViewModel);
return View(myViewModel);
}
}
private void LoadProducts(MyViewModel model)
{
model.Products = context.Product.Select(x => new SelectListItem
{
Text = x.Name,
Value = SqlFunctions.StringConvert((double)x.Id).Trim()
}).ToList();
}
此外,您可以为LoadProducts
提供另一个参数,以便它可以设置所选项目。