У меня есть этот контроллер:
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>
Проблема в моем контроллере, я должен заполнить ViewModel в этих двух методах. Мне это не нравится, я не люблю создавать метод для заполнения ViewModel, потому что, когда проверка не проходит, остальные поля заполняются, почему мои поля Products тоже не заполняются? Я думаю, что использование метода уродливо. Есть ли способ избежать использования другого метода?
Есть ли способ заполнить Producs в моей ViewModel только один раз и кэшировать список продуктов, когда кто-то делает сообщение, а сообщение недействительно.
Если НЕТ, то лучше использовать другой метод. Спасибо.