【发布时间】:2021-10-26 07:18:09
【问题描述】:
我有一个允许用户动态添加项目(在本例中为“电影”)的视图。每部电影都有一个“评级”,应该可以从下拉列表中选择。以前,这来自一个枚举,并且效果很好(这在下面被注释掉了)。不过,“评分”列表最近已移至配置文件中。
代码如下:
创建.cshmtl
@model MyProject.Models.ViewModels.ShelfAddViewModel
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movie[0].Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Movie[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody id="movieContainer">
@Html.EditorFor(model => model.Movie)
</tbody>
<tfoot id="item-list">
<tr>
<td>
<input type="button" id="btnAdd" class="btn" value="Add" />
</td>
</tr>
</tfoot>
...
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script type="text/javascript">
$("#btnAdd").on('click', function () {
$.ajax({
async: true,
data: $('#form').serialize(),
type: "POST",
url: '/Movies/AddMovie',
success: function (partialView) {
$('#movieContainer').html(partialView);
}
});
});
MovieAddViewModel.cshtml
@model MyProject.Models.ViewModels.MovieAddViewModel
<tr>
<td>
<input asp-for="Id" class="form-control" />
</td>
<td>
<select asp-for="Rating" asp-items="Model.RatingList" class="form-control"></select>
@*<select asp-for="Rating" asp-items="Html.GetEnumSelectList<RatingType>()" class="form-control"></select>*@
</td>
<td>
<input type="button" onclick="Remove(this)" id="removeMovie_@Model.Uid" class="btn" value="Remove" />
</td>
</tr>
MovieController.cs
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddMovie([Bind("Id,Movie")] ShelfAddViewModel shelf)
{
shelf.Movies.Add(new MovieAddViewModel());
return PartialView("_Movie", shelf);
}
MovieAddViewModel.cs
public class MovieAddViewModel
{
[Display(Name = "Movie Title")]
public string Name { get; set; }
[Display(Name = "Rating")]
public string Rating { get; set; }
// public RatingType Rating { get; set; }
public List<SelectListItem> RatingList { get; set; }
}
新的评分列表来自一个 JSON 文件,并按如下方式加载:
var standards =
_configuration.GetSection("Standards");
var movieStandards = standards.GetSection("MovieStandards").Get<List<string>>();
var movieStandardSelectList = movieStandards.Select(x=> new SelectListItem() { Text = x, Value = x }).ToList();
我的问题是,如何将这个 List 放到 ViewModel 上?我不能将它添加到构造函数中,因为除非构造函数没有参数,否则 ASP 不知道如何动态创建对象。我不能在创建 ViewModel 时只更新 RatingList 属性,因为当我添加另一部电影时它会消失。我也不觉得我应该直接从我的 ViewModel 访问设置。这里最好的方法是什么?
(请注意:我已经修改了我的代码,以便其他有相同问题的人更容易理解问题 - 对任何错误深表歉意。请告知我是否可以更好地表述我的问题标题)
【问题讨论】:
-
请发布用于创建 MovieAddViewModel.cshtml 的操作
-
我什至没有进入创建 - 当我单击“添加”时,任何前一行的下拉内容都会消失 - 仅填充新条目。
标签: c# asp.net-mvc selectlistitem