从视图向控制器提交表单时,视图模型始终为空

时间:2018-09-22 08:52:50

标签: asp.net-mvc vb.net

我对MVC还是很陌生,并且看到过许多类似的问题,但是我似乎无法使它起作用。我有一个图像文件,我正在尝试从产品列表中选择该图像适用的产品。我创建了一个视图模型,其中包含一个Image对象和一个SelectList产品。图像对象由ID,文件名和ProductID组成。我要实现的是从产品下拉列表中选择产品,然后将“图像”的“ ProductID”字段分配给所选产品的ID。

Public Class ProductImageViewModel
    Public Image As ProductImage
    Public ProductList As SelectList
End Class

在控制器的get方法中,我正在创建viewmodel的实例。我从数据库中分配Image对象,并从已经创建的产品列表中分配ProductList对象,然后将其传递给视图。

    ' GET: ProductImages/Edit/
    Function Edit(ByVal id As Integer?) As ActionResult
        If IsNothing(id) Then
            Return New HttpStatusCodeResult(HttpStatusCode.BadRequest)
        End If
        Dim Model As New ProductImageViewModel
        Model.Image = db.ProductImages.Find(id)
        If IsNothing(Model.Image) Then
            Return HttpNotFound()
        End If
        Model.ProductList = New SelectList(ProductList, "Value", "Text")
        Return View(Model)
    End Function

在视图对象中,它显示文件名和产品的下拉列表。我从列表中选择一种产品,然后单击“提交”,我希望将模型传递回控制器的Post方法。该视图的代码是

@ModelType ProductImageViewModel
    @Code
        ViewData("Title") = "Edit"
        Layout = "~/Views/Shared/_Layout.vbhtml"
    End Code

    <h2>Edit</h2>

    @Using (Html.BeginForm())
        @Html.AntiForgeryToken()

        @<div class="form-horizontal">
            <h4>Product Image</h4>
            <hr />
            @Html.ValidationSummary(True, "", New With {.class = "text-danger"})
            @Html.HiddenFor(Function(Model) Model.Image.ID)

            <div class="form-group">
                @Html.LabelFor(Function(Model) Model.Image.Filename, htmlAttributes:=New With {.class = "control-label col-md-2"})
                <div class="col-md-10">
                    @Html.TextBoxFor(Function(Model) Model.Image.Filename, New With {.htmlAttributes = New With {.class = "form-control"}})
                    @Html.ValidationMessageFor(Function(Model) Model.Image.Filename, "", New With {.class = "text-danger"})
                </div>
            </div>

            <div class="form-group col-md-10">
                @Html.Label("Product", htmlAttributes:=New With {.class = "control-label col-md-2"})
                <div class="col-md-10">     
                    @Html.DropDownListFor(Function(Model) Model.Image.ProductID, Model.ProductList, htmlAttributes:=New With {.class = "control-label col-md-8"})   
                    @Html.ValidationMessageFor(Function(Model) Model.Image.ProductID, "", New With {.class = "text-danger"})
                </div>

            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Save" class="btn btn-default" />
                </div>
            </div>
        </div>  
    End Using

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

    @Section Scripts 
        @Scripts.Render("~/bundles/jqueryval")
    End Section

这将正确显示,我可以选择所需的产品。当我单击“提交”并将断点放在控制器的post方法中时,则Image对象和ProductList对象都不包含任何内容。

' POST: ProductImages/Edit/5
<HttpPost()>
<ValidateAntiForgeryToken()>
Function Edit(ByVal Model As ProductImageViewModel) As ActionResult
    If ModelState.IsValid Then
        db.Entry(Model.Image).State = EntityState.Modified
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If
    Return View()
End Function

我尝试了我在其他帖子中看到的所有建议,但它似乎总是将空模型传递回控制器。可能是对应该如何工作的根本误解,但我对我做错的事情感到茫然。任何帮助将不胜感激。

0 个答案:

没有答案