我们可以在模型资料夹中使用属性别名吗?

问题描述

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 (将#修改为@)