问题描述
MVC的新手。
我的viewmodel
如下:
Namespace viewmodels
Public Class Movieviewmodel
Public Property Id As Integer
<display(Name:="Release Year")>
Public Property ReleaseYear As Integer
Public Property rating As String
Public Property Price As Decimal
Public Property Title As String
Public Property Genres As List(Of Db.Genre)
Public Property GenreCheckBox As List(Of GenreCheckBox)
End Class
End Namespace
对于GenreCheckBox
属性,我不得不使用一个我不喜欢的名称,以便将发布的值返回到viewmodel中:
<HttpPost>
<ValidateAntiForgeryToken>
Public Function Edit(viewmodel As Movieviewmodel) As ActionResult
Dim oUnchecked As Func(Of GenreCheckBox,Boolean)
Dim oChecked As Func(Of GenreCheckBox,Boolean)
Dim oMovie As Db.Movie
Dim oGenre As Db.Genre
If Me.ModelState.IsValid Then
Using oDb As Db.Context = Db.Context.Create
oMovie = oDb.Movies.Include(Function(Movie) Movie.Genres).SingleOrDefault(Function(Movie) Movie.Id = viewmodel.Id)
If oMovie Is nothing Then
Edit = Me.HttpNotFound
Else
oUnchecked = Function(CheckBox) CheckBox.IsChecked = False
oChecked = Function(CheckBox) CheckBox.IsChecked = True
oMovie.ReleaseYear = viewmodel.ReleaseYear
oMovie.rating = viewmodel.rating
oMovie.Price = viewmodel.Price
oMovie.Title = viewmodel.Title
viewmodel.GenreCheckBox.Where(oUnchecked).ForEach(Sub(CheckBox)
^ oGenre = oDb.Genres.Single(Function(Genre) Genre.Id = CheckBox.Id)
| oMovie.Genres.Remove(oGenre)
Ugly End Sub)
viewmodel.GenreCheckBox.Where(oChecked).ForEach(Sub(CheckBox)
^ oGenre = oDb.Genres.Single(Function(Genre) Genre.Id = CheckBox.Id)
| oMovie.Genres.Add(oGenre)
Ugly End Sub)
oDb.SaveChanges()
End If
End Using
Edit = Me.RedirectToAction(NameOf(MoviesController.Index))
Else
Edit = Me.View(viewmodel)
End If
End Function
我希望它像CheckBoxes
之类的东西,但是模型装订工会咳嗽然后吐出来。它希望HTML元素名称与.NET类型名称相同。 (我将讨论here的技术用于集合绑定。)
这是我观点的相关部分:
<div class="form-group">
@Html.LabelFor(Function(Model) Model.Genres,htmlAttributes:=New With {.Class = "control-label col-md-2"})
<div class="col-md-10">
@For iIndex As Integer = 0 To Model.GenreCheckBox.Count - 1
Dim sCheckBoxIsChecked As String
Dim sCheckBoxLabel As String
Dim sCheckBoxId As String
Dim oCheckBox As GenreCheckBox
sCheckBoxIsChecked = String.Format("GenreCheckBox[{0}].IsChecked",iIndex)
sCheckBoxLabel = String.Format("GenreCheckBox[{0}].Label",iIndex)
sCheckBoxId = String.Format("GenreCheckBox[{0}].Id",iIndex)
oCheckBox = Model.GenreCheckBox(iIndex)
@Html.Hidden(sCheckBoxLabel,oCheckBox.Label)
@Html.Hidden(sCheckBoxId,oCheckBox.Id)
@:<label>@Html.CheckBox(sCheckBoxIsChecked,oCheckBox.IsChecked) @oCheckBox.Label</label><br />
Next
</div>
</div>
该代码有效,但是属性名称不易读。是否存在可以用来装饰属性的属性,以便将其他名称发送给模型绑定器?
遵循这些思路的概念,类似于EF中的TableAttribute.Name
:
<UseThisAlias(Name:="GenreCheckBox")>
Public Property CheckBoxes As List(Of GenreCheckBox)
VB或C#,都可以。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)