일부 값이 뷰 모델의 일부로 컨트롤러에 게시되는 페이지가 있습니다. 컨트롤러는 컨트롤러 내에서 목록을 처리하려고 시도하고 처리 할 수없는 값을 다시 반환합니다.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);
}
}
모든 이유를 일으키는 원인이 정확히 지정하기 때문에 내가 대신
"KeyCode"
의token.KeyCode
을 추가 한 추가될 것입니다 왜이 줄에서''Model.Tokens''''''''''''M'''이 당신이 (''ModelTokens'' 람다 식을 사용하고 있습니까? 이 행을'@Html.TextBoxFor (model => model.Tokens [tokenCounter] .KeyCode, new {@class = "form-control"})'로 변경하면 어떻게 될까요? –
안녕하세요, 답변 해 주셔서 감사합니다. 지금 시도했지만 아직 텍스트 상자에 다른 값을 표시하고 있습니다. – Oliver
죄송합니다. 귀하의 의견 처음에 질문을 처음 읽었을 때 등록하지 않았습니다. 자본화 된 M에 대한 특별한 이유가 없으며 지금 당장 시험에서 나옵니다. 차이가 나는 것 같지 않습니다. 좋은 생각이지만, 내 눈이 그걸 훑어 보았습니다. – Oliver