Модель представления всегда пуста при отправке формы из представления в контроллер - PullRequest
0 голосов
/ 22 сентября 2018

Я очень новичок в MVC и видел много похожих вопросов, но я не могу заставить это работать.У меня есть файл изображения, и я пытаюсь выбрать продукт, к которому относится изображение, из списка продуктов.Я создал модель представления, которая содержит объект Image и список продуктов SelectList.Объект Image состоит из идентификатора, имени файла и идентификатора продукта.Я пытаюсь добиться выбора продукта из выпадающего списка продуктов и присвоения поля ProductID на изображении идентификатору выбранного продукта.

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

В методе get моего контроллера я создаю экземпляр модели представления.Я назначаю объект 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

Я испробовал все предложения, которые я видел в других публикациях, но этокажется, что всегда передает пустую модель обратно в контроллер.Вероятно, фундаментальное недопонимание того, как это должно работать, но я не знаю, что я делаю неправильно.Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...