2011-07-22 148 views
2

我有这个控制器:在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,并在某人发布帖子和帖子无效时缓存产品列表。

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

+1

“我不喜欢创建一个方法来填充ViewModel。”所以你说的是你不喜欢可重用的代码? – Dismissile

+0

@Dismissile请参阅更新。 –

+1

@Acaz - 如果你不想使用一种方法(我认为这是正确的选择),你将不得不将数据存储在某处*。你可以缓存它(不保证在回发中),你可以以某种方式序列化它,并使用模型联编程序从价值提供者中重新加载。但是,我认为这是对问题的过度分析。只需使用一种方法...它对C#不可或缺! – TheCloudlessSky

回答

0

创建一个单独的方法来填充您的虚拟机(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提供另一个参数,以便它可以设置选定的项目。

+0

请参阅更新。请 –

相关问题