ASP.Net MVC表单回发上的隐藏字段

时间:2013-04-08 19:08:46

标签: asp.net-mvc forms hidden-field

我的解决方案中有一个控制器和一个强类型视图。在视图中,我有一个最初为空白的隐藏字段。我在视图中有一个表单,用户可以单击"提交"按钮将表单提交给控制器操作。在控制器操作中,我正在修改模型中的值,然后使用修改后的模型重新显示相同的表单(之前发布的)。在View上,我在HTML隐藏字段标记内写了模型字段的值,因此它对客户端javascript是可见的。我遇到的问题是,在javascript中,即使在回发后正确设置了隐藏字段的服务器端值,发布的后面窗体上的隐藏字段的值仍为空白。我需要的是客户端javascipt能够看到隐藏字段的修改值。我需要做些什么才能实现这一目标?

<HttpPost()> _
Function Index(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 = ""
  Dim vrl As List(Of MaxServerLib.ValidationResult) = Nothing

  Try
    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]"

      ' First thing we do is to perform valiation of the criteria
      model.ValidateFieldValues(sCriteria)
      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

        ' Populate the message to be displayed to the user
        model.FormatErrorMessage()
        ' test code start
        ModelState.Clear()
        ' test cod end
        ' Return RedirectToAction("Index", New With {.sMaxUrl = model.MaxUrl, .sDataSource = model.DataSource, .sSessionTicket = model.SessionTicket, .dtLastCall = model.LastCall, .sFileCabinetid = model.FileCabinetId, .sFileCabinetName = model.FileCabinetName, .sShowMsg = MaxServerLib.EscapeString(model.ShowMsg)})
        Return View(model)
      Else
        ' All field values are valid, now attempt to add the document
        If model.ExportDocument() Then
          ' Document export was successful
          System.Diagnostics.Debugger.Break()
        Else
          ' Document export failed for some reason
          ModelState.AddModelError("", model.LastError)
          Return View(model)
        End If
      End If

      ' Return RedirectToAction("Index", "SearchResults", New With {.sMaxUrl = model.MaxUrl, .sDataSource = model.DataSource, .sSessionTicket = model.SessionTicket, .dtLastCall = model.LastCall, .sFileCabinetId = model.FileCabinetId, .sFileCabinetName = model.FileCabinetName, .sSearchCriteria = sSearchCriteria})
    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

1 个答案:

答案 0 :(得分:0)

如果您要回发相同的表单,那么很可能是它在绑定时从模型状态中提取原始值。

在返回表单之前调用ModelState.Clear()以查看是否修复了它。