2011-07-22 11 views
2

私はこのコントローラを持っている:DropDownListForをAsp.Net MVC 3で処理する最も良い方法は何ですか?

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:

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にProducsを一度だけ取り込み、誰かが投稿をしてその投稿が有効でないときに商品リストをキャッシュする方法はありますか?

そうでない場合は、別の方法を使用することをおすすめします。ありがとう。

+1

"ViewModelを設定するメソッドも作成したくありません。"だからあなたが言っているのは、再利用可能なコードが気に入らないということです。 – Dismissile

+0

@Dismissile更新を参照してください。 –

+1

@Acaz - (私が正しい選択だと思う)メソッドを使いたくないのなら、あなたは*どこかに*データを格納しなければならないでしょう。キャッシュすることができます(ポストバックには存在しないことがあります)。何らかの形でシリアル化し、モデルバインダーを使用してバリュープロバイダーから再ロードできます。しかし、私はこれが問題を過度に分析していると思います。ちょうどメソッドを使用して...それはC#に不可欠です:)! – TheCloudlessSky

答えて

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のために別のパラメータを提供することができます。

+0

更新を参照してください。お願いします –

関連する問題