Какой лучший способ справиться с DropDownListFor в Asp.Net MVC 3? - PullRequest
2 голосов
/ 23 июля 2011

У меня есть этот контроллер:

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 только один раз и кэшировать список продуктов, когда кто-то делает сообщение, а сообщение недействительно.

Если НЕТ, то лучше использовать другой метод. Спасибо.

1 Ответ

0 голосов
/ 23 июля 2011

Что не так с созданием отдельного метода для заполнения вашей виртуальной машины (для 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, чтобы он мог установить выбранный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...