Asp.net mvc 在mvc3.vb.net中,httppost对复杂对象不返回任何内容
我的MVC3 vb.net应用程序有问题。当我尝试将我所做的更改发布到控制器时,模型不会发送到控制器 我已经尝试了很多帖子,比如和,但是我不确定如何在我的应用程序中实现它们,因为我的模型没有发送IEnumerable类型 最后,我只希望模型为每个批返回一个值,即我将保存到数据库的值 当我发布模型并尝试发送给控制器时,页面通过post发送以下内容:Asp.net mvc 在mvc3.vb.net中,httppost对复杂对象不返回任何内容,asp.net-mvc,vb.net,asp.net-mvc-3,web-applications,razor,Asp.net Mvc,Vb.net,Asp.net Mvc 3,Web Applications,Razor,我的MVC3 vb.net应用程序有问题。当我尝试将我所做的更改发布到控制器时,模型不会发送到控制器 我已经尝试了很多帖子,比如和,但是我不确定如何在我的应用程序中实现它们,因为我的模型没有发送IEnumerable类型 最后,我只希望模型为每个批返回一个值,即我将保存到数据库的值 当我发布模型并尝试发送给控制器时,页面通过post发送以下内容: Client=2&Datacenters=20&BatchesForAssignation[0].CenterID=4&Bat
Client=2&Datacenters=20&BatchesForAssignation[0].CenterID=4&BatchesForAssignation[1].CenterID=20&BatchesForAssignation[1].DatacenterID=14...
但是我不知道如何将这个查询字符串转换成一个BatchesForAssignation对象,将其分配给模型并发送给控制器
注意:查询字符串中显示的客户端和数据中心的值不在控制器中使用。我需要批处理[n].CenterID部分
你能告诉我怎么解决这个问题吗
这是我在MVC应用程序中使用的对象(代码压缩):
批次:
Public class Batch
public property ID as integer
public property CenterID as integer
public property name as string
end class
中心(此对象仅存储将分配给批次的所有中心列表。名称仅用于在下拉列表中显示名称):
(还有一个Batchlist和一个Centerlist对象,它们充当从CollectionBase继承的集合,用于存储所有批处理和中心对象。如果需要类定义,请告诉我,但非常简单)
模型如下
Public class ProcessingModel
public property BatchesForAssignation as BatchList
public property Datacenters as CenterList
End class
控制器如下:
<HttpGet()>
<Authorize()> _
Public Function AssignToDataCenters() As ActionResult
Dim model As New ProcessingModel
Dim BatchHandler As New BatchControl
'This line will get the list of batches without datacenter
model.BatchesForAssignation = BatchHandler.GetBatchesAvailable(ConnectionString)
'This method will get the list of Datacenters available
model.Datacenters=BatchHandler.GetDatacenters(ConnectionString)
return View(model)
End Function
_
公共函数AssignToDataCenters()作为ActionResult
Dim模型作为一种新的加工模型
Dim BatchHandler作为新的BatchControl
'此行将获取不带数据中心的批次列表
model.BatchesForAssignation=BatchHandler.GetBatchesAvailable(ConnectionString)
'此方法将获取可用的数据中心列表
model.Datacenters=BatchHandler.GetDatacenters(ConnectionString)
返回视图(模型)
端函数
HttpPost(这实际上不起作用,因为模型返回一个空模型):
_
将公共函数分配给数据中心(ByVal模型作为处理模型)作为ActionResult
Dim BatchHandler作为新的BatchControl
将结果保存为布尔值=false
'此行将获取不带数据中心的批次列表
model.BatchesForAssignation=BatchHandler.GetBatchesAvailable(ConnectionString)
'此方法保存模型返回的信息
SaveResult=BatchHandler.UpdateBatches(模型)
ViewBag(“结果”)=保存结果
返回视图(模型)
端函数
视图如下所示(是强类型视图):
@ModelType MVCAdmin.ProcessingModel
@代码
ViewData(“标题”)=“将批次分配给中心”
结束代码
@使用Html.BeginForm()
@
将批分配给:
名称
@代码
对于i,整数=0到Model.BatchesForAssignation.Count-1
将a调整为整数=i
@
@Html.DropDownListFor(函数(m)m.BatchesForAssignation(a).CenterID,新选择列表(Model.Datacenters,“ID”,“name”,Model.BatchesForAssignation(i).CenterID),“”)
@模型.批处理用于分配(i).名称
下一个
结束代码
终端使用
提前谢谢
更新2012-06-14:
在做了一些研究之后,我发现我可以使用request.Form来解析控制器中的querystring。我可以解析视图发送的结果。但是查询字符串键的格式为BatchesForAssignation[0]。CenterID
,BatchesForAssignation[1]。CenterID
,BatchesForAssignation[2]。CenterID
等等
是否有更好的方法“自动”完成此操作,以便模型解析查询字符串并将解析后的对象发送给控制器
再次…提前感谢查看后,我发现创建模型并将其发送给控制器的最佳方法是创建一个CustomModelBinder
(从IModelBinder
界面)并使用controllerContext.HttpContext.Request.form
属性在BindModel
方法上解析表单的查询字符串。大概是这样的:
Public Class ProcessingModelBinder
implements IModelBinder
public Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object
dim model as ProcessingModel = if(nothing.equals(bindingContext.Model),directcast(bindingContext.Model,directcast(DependencyResolver.Current.GetService(typeof(ProcessingModel))
dim Keys as string()=controllerContext.HttpContext.Request.Form.AllKeys
for each key in Keys
'Fill the model required parameters
Next
return model
End Function
最后在global.asax文件中注册新的模型生成器
Sub Application_Start()
AreaRegistration.RegisterAllAreas()
ModelBinders.Binders.Add(typeof(ProcessingModel),New ProcessingModelBinder())
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub
我希望这能帮助别人
查看后,我发现创建模型并将其发送给控制器的最佳方法是创建CustomModelBinder
(从IModelBinder
界面)并使用controllerContext.HttpContext.Request.form
属性在BindModel
方法上解析表单的查询字符串。大概是这样的:
Public Class ProcessingModelBinder
implements IModelBinder
public Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object
dim model as ProcessingModel = if(nothing.equals(bindingContext.Model),directcast(bindingContext.Model,directcast(DependencyResolver.Current.GetService(typeof(ProcessingModel))
dim Keys as string()=controllerContext.HttpContext.Request.Form.AllKeys
for each key in Keys
'Fill the model required parameters
Next
return model
End Function
最后在global.asax文件中注册新的模型生成器
Sub Application_Start()
AreaRegistration.RegisterAllAreas()
ModelBinders.Binders.Add(typeof(ProcessingModel),New ProcessingModelBinder())
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub
我希望这能帮助别人
关于如果您的视图使用的是ProcessingModel
,那么为什么不将其作为AssignToDataCenters
的参数呢?因为该方法是在视图第一次加载时加载的。让我包括失败的HttpPost的代码。感谢您的观点如果您的视图使用的是ProcessingModel
,那么为什么不将其作为AssignToDataCenters
的参数呢?因为该方法是在视图第一次加载时加载的。让我包括失败的HttpPost的代码。谢谢你的意见如果你认为你有任何其他方法,请让我知道。谢谢如果你认为你还有别的办法,请告诉我。谢谢
Sub Application_Start()
AreaRegistration.RegisterAllAreas()
ModelBinders.Binders.Add(typeof(ProcessingModel),New ProcessingModelBinder())
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub