2013-04-08 57 views
0

我在我的解决方案中有一个控制器和一个强类型的视图。在视图中,我有一个最初空白的隐藏字段。我在视图中有一个表单,用户可以单击“提交”按钮将表单提交给控制器操作。在控制器操作中,我正在修改模型内的值,然后使用修改后的模型重新显示相同的表单(以前发布的表单)。在视图上,我将模型字段的值写入HTML隐藏字段标记内,以便客户端javascript可以看到它。我遇到的问题是,在javascript中,即使隐藏字段的服务器端值在回发后正确设置,发布的表单上的隐藏字段的值也为空。我需要的是客户端javascipt能够看到隐藏字段的修改值。我需要做些什么才能做到这一点?ASP.Net MVC表单回传中的隐藏字段

<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 
+0

显示与隐藏字段相关的视图标记 – Igor 2013-04-08 19:11:24

+0

几乎不可能在没有看到某些标记的情况下提供帮助,Brian。 – 2013-04-08 20:56:50

+0

查看隐藏字段的标记是:@ 2013-04-10 13:48:07

回答

0

如果您发回相同的表单,那么最有可能在绑定时将原始值从模型状态拉回。

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

+0

我已经尝试清除模型状态,但它没有解决问题。这个问题显然与视图中的JavaScript代码执行时相关。我曾假设只有在服务器端代码完成之后才会执行javascript,但如果服务器端代码正确设置隐藏字段,但客户端代码没有看到更新的值,则这可能不是真的。 – 2013-04-10 13:45:42

+0

当部分返回时,如何将其返回到您的页面?你能编辑你的问题并在那里显示代码吗? – Slicksim 2013-04-10 13:58:31

+0

我将修改后的模型传递给视图。请参阅处理帖子的控制器代码的编辑问题。 – 2013-04-11 20:40:30