在Asp.Net MVC 3中处理DropDownListFor的最佳方法是什么?

时间:2011-07-22 20:11:42

标签: .net asp.net-mvc razor

我有这个控制器:

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,并在有人发帖并且帖子无效时缓存产品列表。

如果不是,更好的方法是使用另一种方法。感谢。

1 个答案:

答案 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提供另一个参数,以便它可以设置所选项目。