2009-06-30 10 views
0

アクションインデックスを持つProductControllerがあります(これは空白のフォームを読み込みます)。その複雑な形態として、それ自体にも投稿フォームやドロップダウンなどのフォーム要素はMVCのPOST-Redirect-GETで検証メッセージが失われる

public ActionResult Index() 
    { 
     int id; 
     id = Convert.ToInt32(Request.Form["ddlLendingType"]); 
     if (id == 0) 
      id = 1; 
     ProductCommonViewModel viewData = new ProductCommonViewModel(_prodRepository.Method1(),_prodRepository.Method2()) 
     return View(viewData); 
    } 

私は、フォームから送信する]をクリックすると、それはそれを失敗した場合、それは製品を保存し、以下のようにコードがある掲示値 を表示検証エラーメッセージが表示されるはずです。次のように

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save(FormCollection fc) 
    { 
     Product product = new Product(); 
     try 
     { 
      ...fill out all properties from form collection 
      _prodRepository.SaveProduct(product); 

      return RedirectToAction("Index", "Product"); 
     } 
     catch (Exception ex) 
     { 
      TempData["Message"] = "An Error Occured while saving the product!"; 
      Validation.UpdateModelStateWithRuleViolation(product, ViewData.ModelState); 
      // WHEN I call redirect to action Index on this view I can see the TempData variable but I cannot see validation summary and individual validation messages.How do I persist the msgs across requests? 
     } 

    } 

ヘルパーメソッドの定義は次のとおりです。あまりにもTempDataをに

public static void UpdateModelStateWithRuleViolation(IRuleEntity entity, ModelStateDictionary dictModel) 
    { 
     List<RuleViolation> violations = entity.GetRuleViolations(); 

     foreach (var item in violations) 
     { 
      dictModel.AddModelError(item.PropertyName, item.ErrorMessage); 
     } 
    } 

答えて

2

パスにModelState。

ところで、これに代えて:

public ActionResult Index(int ddlLendingType) 
     { 

そしてFormCollectionを使用すべきではない悪い習慣である使用:

public ActionResult Index() 
    { 
     int id; //and here You could join declaration with assignment 
     id = Convert.ToInt32(Request.Form["ddlLendingType"]); 

あなたがこれを行うことができます。極端な場合には、カスタムモデルバインダー(CodeCampServerは非常に素敵なバインディングメカニズムを持っています)またはアクションフィルター(Kiggソース)を作成してください。

+0

にはどうすれば)のActionResultインデックスからのActionResultインデックス(int型)(呼ぶのですか? ? – chugh97

+0

なぜそれが必要でしょうか? Index(int ddlLendingType)は、Index()の代わりになるはずです。しかし、それが必要な場合は、何も気にしません。「Public ActionResult Index(){return Index(1);}」が動作するはずです。 –

1

私はすべてのためにTempDataをリフレッシュするために、私は次のようでしたが、複数のリクエスト間でTempDataをを維持するとの問題を抱えていたが、アクションをリダイレクト:

protected override RedirectToRouteResult RedirectToAction(string actionName, 
    string controllerName, System.Web.Routing.RouteValueDictionary routeValues) 
{ 
    TempData["Notice"] = TempData["Notice"]; 
    TempData["Error"] = TempData["Error"]; 
    TempData["Warning"] = TempData["Warning"]; 
    return base.RedirectToAction(actionName, controllerName, routeValues); 
} 
関連する問題