2017-02-22 87 views
0

我有一個頁面,其中一些值作爲視圖模型的一部分發布到我的控制器。控制器試圖在控制器內處理一個列表,並回吐它無法處理的任何值。MVC剃刀編輯模型值更改

現在第一次加載頁面的所有內容都很好,但是當用戶發佈任何不正確的令牌時,Razor或ASP.NET會隨着數據的傳播而混亂。

因此,如果用戶發送的:

Token1 = ABC 
Token2 = DEF 
Token3 = GHI 

和令牌1和3失敗,然後將其傳回是模型:

Token1 = ABC 
Token3 = GHI 

但是被渲染爲:

Token1 = ABC 
Token3 = DEF 

我已經驗證了我將正確的數據傳回給我已經告訴它只輸出keyco的文本框旁邊de(即:從上面的「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; } 
    ... 
} 

令牌類不是一個嚴格的ViewModel只有類(而BulkTokenCreateModel類是),但是有問題的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

任何理由爲什麼在這一行中:'@ Html.TextBoxFor(model => Model.Tokens [tokenCounter] .KeyCode,new {@class =「form-control」})'Model.Tokens'中的'M'是大寫,當你'使用lambda表達式?如果將該行更改爲'@ Html.TextBoxFor(model => model.Tokens [tokenCounter] .KeyCode,new {@class =「form-control」})''會發生什麼? –

+0

嗨,感謝您的回覆,我剛剛嘗試過,它仍然在文本框中顯示不同的值。 – Oliver

+0

很抱歉,在您評論開始時的問題沒有在我第一次閱讀時註冊。大寫M沒有什麼特別的理由,從我剛纔的測試來看,似乎沒有什麼區別。不錯,但我的眼睛掩蓋了這一點。 – Oliver

回答

1

這是因爲HTML輔助他們首先看的ModelState結合自己的價值觀時,和然後在模型中。如果要更改控制器中模型的值,則必須使用ModelState.Clear();來清除ModelState中的值。所以你的代碼會像

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); 
     } 
    } 

,你的看法會

<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> 

此外,我已經添加token.KeyCode代替"KeyCode",因爲它會準確指定令牌導致錯誤

+0

嗨,謝謝你的回答,我現在不得不離開辦公室,但看起來這可能是問題所在。如果可以的話,我會盡快進行測試,明天下午的最後一天,如果是的話,會給你甜蜜的業力獎勵。再次感謝 – Oliver

+0

你在驗證中犯了更多錯誤讓我更新我的答案 – Usman