ビューモデルの一部として一部の値がコントローラに投稿されるページがあります。コントローラーはコントローラー内のリストを処理しようとし、処理できなかった値を返す。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);
}
}
どれでも理由の原因となっているトークンを正確に指定されますので、私は
token.KeyCode
代わりの"KeyCode"
を追加したほかにになりますなぜなら、この行で '@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 "})'に変更するとどうなりますか? –
こんにちは、あなたの応答をありがとう、私は今、それを試して、それはまだそれがされる必要があるテキストボックスに別の値を表示しています。 – Oliver
ご迷惑をおかけして申し訳ございません。あなたのコメントの冒頭に質問がありましたが、私はそれを初めて読む時に登録しませんでした。大文字のMの特別な理由はなく、私のテストからちょうど今のところ、それは違いを生じさせていないようです。私の目がそれを覆したので、良い点。 – Oliver