2017-02-22 2 views
0

일부 값이 뷰 모델의 일부로 컨트롤러에 게시되는 페이지가 있습니다. 컨트롤러는 컨트롤러 내에서 목록을 처리하려고 시도하고 처리 할 수없는 값을 다시 반환합니다.MVC 면도기 모델 값 수정

페이지가 처음로드 될 때마다 사용자가 잘못된 토큰을 게시하면 Razor 또는 ASP.NET에서 데이터가 사라집니다.

Token1 = ABC 
Token2 = DEF 
Token3 = GHI 

그리고 토큰 1과 3이 다시 IS 전달되는 모델 실패 :

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 클래스 동안 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

모든 이유를 일으키는 원인이 정확히 지정하기 때문에 내가 대신 "KeyCode"token.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> 

될 것입니다 왜이 줄에서''Model.Tokens''''''''''''M'''이 당신이 (''ModelTokens'' 람다 식을 사용하고 있습니까? 이 행을'@Html.TextBoxFor (model => model.Tokens [tokenCounter] .KeyCode, new {@class = "form-control"})'로 변경하면 어떻게 될까요? –

+0

안녕하세요, 답변 해 주셔서 감사합니다. 지금 시도했지만 아직 텍스트 상자에 다른 값을 표시하고 있습니다. – Oliver

+0

죄송합니다. 귀하의 의견 처음에 질문을 처음 읽었을 때 등록하지 않았습니다. 자본화 된 M에 대한 특별한 이유가 없으며 지금 당장 시험에서 나옵니다. 차이가 나는 것 같지 않습니다. 좋은 생각이지만, 내 눈이 그걸 훑어 보았습니다. – Oliver

답변

1

이 때문에 HTML의 해당 값을 바인딩 할 때 먼저 ModelState보고 헬퍼 그리고 발생 컨트롤러에서 모델의 값을 변경하는 경우 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