2017-02-22 11 views
0

ビューモデルの一部として一部の値がコントローラに投稿されるページがあります。コントローラーはコントローラー内のリストを処理しようとし、処理できなかった値を返す。MVC Razorモデル値の編集変更

ページがすべて読み込まれるのは初めてですが、ユーザーが間違ったトークンを投稿した場合、RazorやASP.NETはデータが消えてしまいます。だから、

ユーザーが送信した場合:

Token1 = ABC 
Token2 = DEF 
Token3 = GHI 

とトークン1と3が戻されるモデルである、その後失敗:

Token1 = ABC 
Token3 = GHI 

しかし、何がレンダリングされることは次のとおりです。

Token1 = ABC 
Token3 = DEF 

私は正しいデータをテキストボックスの隣に戻していることを確認しました。 (つまり、上の "GHI")、テキストとして正しい値をレンダリングしますが、隣のテキストボックスで同じ変数(Model.Tokens [tokenCounter] .KeyCode)を参照します。が正しくレンダリングされません。

コントローラでのコード:

if (failedTokens.Count == 0) 
{ 
    // Forward to success page 
    ... 
} 
else 
{ 
    ModelState.AddModelError("", "Tokens couldn't be added"); 
    bulkTokenCreateModel.Tokens = failedTokens; 
    return View(..., bulkTokenCreateModel); 
} 

コードビューで:

@for (var tokenCounter = 0; tokenCounter < Model.Tokens.Count; tokenCounter++) 
{ 
    ... 
    <td> 
     <div class="form-group"> 
      @Model.Tokens[tokenCounter].KeyCode 
      @Html.TextBoxFor(model => Model.Tokens[tokenCounter].KeyCode, new { @class = "form-control" }) 
     </div> 
    </td> 
    ... 
} 

私は唯一のモデルをいじりASP.NETやカミソリにこれを置くことができますか?あるいは、私は何か愚かな行方不明ですか?

は、クラスを追加するように要求されています:

public class BulkTokenCreateModel 
{ 
    public string Notes { get; set; } 
    public int Quantity { get; set; } 
    public List<Token> Tokens { get; set; } 
} 

public class Token 
{ 
    public int FobId { get; set; } 
    public DateTime DateAdded { get; set; } 
    public string KeyCode { get; set; } 
    ... 
} 

トークンクラスがBulkTokenCreateModelクラスながら(厳密のViewModelクラスだけではありませんチェックするための任意の考え、または何かは非常に有用

EDITだろうis)、問題のKeyCodeプロパティは単純な文字列プロパティです。私はクラスの他の部分を削除して、ソフトウェアの内部動作についてあまりにも多くの情報を与えることを恐れています。必要があれば、私はもっと投稿することができますが、そのクラスのものはKeyCodeプロパティを妨害しません。

EDIT2:

はので、ここで、コントローラのアクションで完全なコードを求め行くた:

public ActionResult ScanTokensComplete(BulkTokenCreateModel bulkTokenCreateModel) 
    { 
     var businessLayer = BusinessLayerManager.Current; 
     var failedTokens = new List<Token>(); 

     foreach (var token in bulkTokenCreateModel.Tokens) 
     { 
      try 
      { 
       token.DateAdded = DateTime.Now; 
       token.Enabled = true; 

       var addedToken = businessLayer.TokenAdd(token); 
      } 
      catch (FaultException<ArgumentNullFault> detail) 
      { 
       failedTokens.Add(token); 
       ModelState.AddModelError("KeyCode", detail.Detail.Message + $" : Token : { token.KeyCode }"); 
      } 
      catch (Exception ex) 
      { 
       failedTokens.Add(token); 
       ModelState.AddModelError("KeyCode", ex.Message + $" : Token : { token.KeyCode }"); 
      } 
     } 

     if (failedTokens.Count == 0) 
     { 
      SearchCache.UpdateCache(typeof(Token), User.BrowsingClientId); 
      return RedirectToAction(...); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Tokens couldn't be added"); 
      bulkTokenCreateModel.Tokens = failedTokens; 
      return View(..., bulkTokenCreateModel); 
     } 
    } 
+0

どれでも理由の原因となっているトークンを正確に指定されますので、私はtoken.KeyCode代わりの"KeyCode"を追加したほかに

<div class="form-group"> @Html.ValidationMessage(Model.Tokens[tokenCounter].KeyCode) @Model.Tokens[tokenCounter].KeyCode @Html.TextBoxFor(model => Model.Tokens[tokenCounter].KeyCode, new { @class = "form-control" }) </div> 

になりますなぜなら、この行で '@Html.TextBoxFor(model => Model.Tokens [tokenCounter] .KeyCode、new {@class =" form-control "})' 'Model.Tokens'の' M'はあなたがラムダ式を使っていますか?その行を '@Html.TextBoxFor(model => model.Tokens [tokenCounter] .KeyCode、new {@class =" form-control "})'に変更するとどうなりますか? –

+0

こんにちは、あなたの応答をありがとう、私は今、それを試して、それはまだそれがされる必要があるテキストボックスに別の値を表示しています。 – Oliver

+0

ご迷惑をおかけして申し訳ございません。あなたのコメントの冒頭に質問がありましたが、私はそれを初めて読む時に登録しませんでした。大文字のMの特別な理由はなく、私のテストからちょうど今のところ、それは違いを生じさせていないようです。私の目がそれを覆したので、良い点。 – Oliver

答えて

1

その値をバインドするとき、彼らは最初にModelStateを見てHTMLヘルパーのためにそれが起こると、コントローラーのモデルの値を変更する場合は、ModelStateの値をクリアするためにModelState.Clear();を使用する必要があります。ので、あなたのコードは

public ActionResult ScanTokensComplete(BulkTokenCreateModel bulkTokenCreateModel) 
    { 
     ModelState.Clear(); 
     var businessLayer = BusinessLayerManager.Current; 
     var failedTokens = new List<Token>(); 

     foreach (var token in bulkTokenCreateModel.Tokens) 
     { 
      try 
      { 
       token.DateAdded = DateTime.Now; 
       token.Enabled = true; 

       var addedToken = businessLayer.TokenAdd(token); 
      } 
      catch (FaultException<ArgumentNullFault> detail) 
      { 
       failedTokens.Add(token); 
       ModelState.AddModelError(token.KeyCode, detail.Detail.Message + $" : Token : { token.KeyCode }"); 
      } 
      catch (Exception ex) 
      { 
       failedTokens.Add(token); 
       ModelState.AddModelError(token.KeyCode, ex.Message + $" : Token : { token.KeyCode }"); 
      } 
     } 

     if (failedTokens.Count == 0) 
     { 
      SearchCache.UpdateCache(typeof(Token), User.BrowsingClientId); 
      return RedirectToAction(...); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Tokens couldn't be added"); 
      bulkTokenCreateModel.Tokens = failedTokens; 
      return View(..., bulkTokenCreateModel); 
     } 
    } 

ようになると、あなたのビューが、それは誤り

+0

こんにちは、あなたの答えをありがとう、私は今日のオフィスを去らなければならなかったが、それは問題のように見えます。できるだけ早く、最新の明日の午後にテストし、もしあれば、あなたに甘いカルマを授与します。ありがとうございました – Oliver

+0

もう一度間違いをしています – Usman

関連する問題