我有這個控制器:在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,並在某人發佈帖子和帖子無效時緩存產品列表。
如果不是,更好的方法是使用另一種方法。謝謝。
「我不喜歡創建一個方法來填充ViewModel。」所以你說的是你不喜歡可重用的代碼? – Dismissile
@Dismissile請參閱更新。 –
@Acaz - 如果你不想使用一種方法(我認爲這是正確的選擇),你將不得不將數據存儲在某處*。你可以緩存它(不保證在回發中),你可以以某種方式序列化它,並使用模型聯編程序從價值提供者中重新加載。但是,我認爲這是對問題的過度分析。只需使用一種方法...它對C#不可或缺! – TheCloudlessSky