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