2011-07-22 139 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

請參閱更新。請 –

相關問題