我有一個頁面,其中一些值作爲視圖模型的一部分發布到我的控制器。控制器試圖在控制器內處理一個列表,並回吐它無法處理的任何值。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);
}
}
任何理由爲什麼在這一行中:'@ 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」})''會發生什麼? –
嗨,感謝您的回覆,我剛剛嘗試過,它仍然在文本框中顯示不同的值。 – Oliver
很抱歉,在您評論開始時的問題沒有在我第一次閱讀時註冊。大寫M沒有什麼特別的理由,從我剛纔的測試來看,似乎沒有什麼區別。不錯,但我的眼睛掩蓋了這一點。 – Oliver