Asp.net mvc 在mvc3.vb.net中,httppost对复杂对象不返回任何内容

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

我的MVC3 vb.net应用程序有问题。当我尝试将我所做的更改发布到控制器时,模型不会发送到控制器

我已经尝试了很多帖子,比如和,但是我不确定如何在我的应用程序中实现它们,因为我的模型没有发送IEnumerable类型

最后,我只希望模型为每个批返回一个值,即我将保存到数据库的值

当我发布模型并尝试发送给控制器时,页面通过post发送以下内容:

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