私の問題の事実は次のとおりです。
- ASP.Net MVC 4 Web アプリケーションにフォームがあります。
- フォームのフィールドは、モデル内の明示的な静的プロパティに関連付けられていません。代わりに、変更可能な動的フィールドです。
- フォームが送信されると、FormcCollection を使用してフィールド値に入力された値を取得します。
- 初めてフォームを送信したときは、すべて問題ありません。FormCollection の値は、フォームの値を正確に反映しています。
- 1 つ以上の無効なフィールドが原因でフィールド値に問題がある場合は、フォームを再表示します。
- ユーザーがフォームの値を変更して検証エラーを修正し、同じフォームを再送信した場合、FormCollection は最新のフォーム値を反映するように更新されません。代わりに、最初の送信からのフィールド値が常に含まれます。
なぜこれが起こっているのですか、どうすれば修正できますか?
<HttpPost()> _
<HttpParamAction()> _
Function Upload(ByVal model As MaxDocument, formcollection As FormCollection) As ActionResult
Dim sCriteria As String = ""
Dim nKeyIndex As Integer = 0
Dim nFieldIndex As Integer = -1
Dim sFieldValue As String = ""
Try
' Build sCriteria from the submitted formcollection
model.GetFileCabinetFieldList()
For nFieldIndex = 0 To (model.IndexFieldCount - 1)
sFieldValue = ""
If nFieldIndex > 0 Then
sCriteria += "~"
End If
Dim fcf As MaxServerLib.FileCabinetField = model.criterionAtIndex(nFieldIndex)
' Get the field value corresponding to this field
For Each oKey As Object In formcollection.AllKeys
If oKey.ToString = fcf.sFieldName Then
sFieldValue = formcollection(oKey.ToString)
Exit For
End If
Next
sCriteria += sFieldValue
Next
If sCriteria = "" Then sCriteria = "[BlankIndex]"
' Set the criteria property of the model, which will be used for both field validation and document export.
model.Criteria = sCriteria
' First thing we do is to perform valiation of the criteria
model.ValidateFieldValues()
If Not model.AllFieldValuesValid() Then
' Handle case where one or more field values are invalid.
' In this case we want to redisplay the form but show an error message listing the invalid fields
model.HasAttemptedUpload = True
' Set tempData before redirect:
TempData("MaxDocument") = model
Return RedirectToAction("Index")
Else
' All field values are valid, now attempt to add the document
...
End If
Catch ex As Exception
System.Diagnostics.Debugger.Break()
End Try
'End If
' If we got this far, something failed, redisplay form
Return View(model)
End Function
編集:
発生しているように見えるのは、ブラウザが最初の投稿から投稿アクションをキャッシュし、後続のすべての投稿 (最初の投稿の後) で、現在の投稿の結果をレンダリングする代わりに、最初の投稿のキャッシュされた結果をレンダリングすることです。なぜこれを行うのでしょうか?