httppost没有返回值与MVC3剃刀vb.net复杂的对象(httppost returns n

2019-09-26 00:18发布

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

我试图按照很多帖子喜欢这一个和这一个 ,但我不知道如何实现他们在我的应用程序,因为我的模型没有送IEnumerable的类型。

最后我只希望,该模型为每个批次那就是我将保存到数据库中的值返回一个值。

当我发布模型,并尝试发送到控制器的页面将通过邮寄的情况如下:

Client=2&Datacenters=20&BatchesForAssignation[0].CenterID=4&BatchesForAssignation[1].CenterID=20&BatchesForAssignation[1].DatacenterID=14...

但我不知道如何将这个查询字符串转换为BatchesForAssignation对象,将其分配给模型,并发送到控制器。

注: 客户机 ,并在查询字符串中所示数据中心的值在控制器不使用。 我需要BatchesForAssignation [N] .CenterID一部分。

能否请你点我找到了一个解决方案?

这是我用我的MVC应用程序(代码压缩)的对象:

批量:

Public class Batch
    public property ID as integer
    public property CenterID as integer
    public property name as string
end class

中心(该对象只是存储将被分配到批量中心的所有列表的名称只是在下拉列表中显示的名称。):

Public class Center
    public property ID as integer
    public property name as string
end class

(还有一个Batchlist以及用作集合从CollectionBase中存储的所有批次和中心的对象继承了Centerlist对象。如果你需要的类定义,请让我知道,但很strightforward)。

该模型如下:

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

HttpPost(这实际上是不工作,因为该模型将返回一个空模型):

<HttpPost()>
<Authorize()> _
Public Function AssignToDataCenters(ByVal Model as ProcessingModel) As ActionResult
    Dim BatchHandler As New BatchControl
    Dim SaveResult as Boolean=false

    'This line will get the list of batches without datacenter
    model.BatchesForAssignation = BatchHandler.GetBatchesAvailable(ConnectionString)

    'This method save the information returned by the model
    SaveResult=BatchHandler.UpdateBatches(model)

    ViewBag("Result")=SaveResult
    Return View(model)
End Function

查看如下(是一个强类型的视图):

@ModelType MVCAdmin.ProcessingModel

@Code
    ViewData("Title") = "Assign Batches To centers"
End Code

@Using Html.BeginForm()
    @<table id="tblAvailableBatches">
        <thead>
            <tr>
                <th>Assign batch to:</th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            @code
                For i As Integer = 0 To Model.BatchesForAssignation.Count - 1
                    Dim a As Integer = i
                    @<tr>
                        <td>@Html.DropDownListFor(Function(m) m.BatchesForAssignation(a).CenterID, New SelectList(Model.Datacenters, "ID", "name", model.BatchesForAssignation(i).CenterID), " ")</td>
                        <td>@Model.BatchesForAssignation(i).name</td>
                    </tr>        
                Next
            End Code
        </tbody>
    </table>
    <input type="button" value="Apply changes" id="btnApply" />
End Using

提前致谢

更新2012-06-14:

使得一些researh后,我发现,我可以分析使用控制器的查询字符串request.Form我可以分析由视图送来的结果。 但查询字符串键的形式BatchesForAssignation[0].CenterIDBatchesForAssignation[1].CenterIDBatchesForAssignation[2].CenterID等等...

有没有更好的办法来做到这一点“自动地”使模型解析查询字符串和解析的对象发送到控制器?

预先再次...谢谢

Answer 1:

审查后, 这个问题我已经找到了最好的方式来创建模型,并将其发送到控制器创建CustomModelBinder (从IModelBinder接口)和解析的形式的查询字符串BindModel使用方法controllerContext.HttpContext.Request.Form属性。 事情是这样的:

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

我希望这可以帮助别人

问候



文章来源: httppost returns nothing with complex objects in mvc3 razor vb.net