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