【问题标题】:Select List not populating from ViewModel ASP.NET选择未从 ViewModel ASP.NET 填充的列表
【发布时间】:2019-08-26 05:26:40
【问题描述】:

我的一个视图中的选择列表没有从视图模型中填充,我无法弄清楚。视图模型的其他部分按预期运行。如果重要的话,该视图是部分视图。

这是视图的代码:

 @model Workout_Tracker.ViewModels.AddExerciseViewModel
        <form >
           <div class="individualContainer">
                <label asp-for="ExerciseTypeID"></label>
                <select asp-for="ExerciseTypeID" asp-items="Model.ExercisesTypes">
                </select>
                <label asp-for="Reps"></label>
                <input type="number" asp-for="Reps" />
               </div>
            </form>

这是视图模型:

public class AddExerciseViewModel
{
    [Display(Name ="Weight")]
    [Required(ErrorMessage="You must enter a weight.")]
    public int Weight { get; set; }

    public int Reps { get; set; }

    //this sets will be used to create the sets in the Exercise_Sets table
    public int Sets { get; set; }

    public int WorkoutID { get; set; }

    public int ExerciseTypeID { get; set; }

    public List<SelectListItem> ExercisesTypes { get; set; }

    public AddExerciseViewModel(IEnumerable<ExerciseType> exercises) {

        ExercisesTypes = new List<SelectListItem>();
        foreach (ExerciseType ex in exercises)
        {
            ExercisesTypes.Add(new SelectListItem
            {
                Value = ex.ID.ToString(),
                Text = ex.Name                  
            });
        }
    }

    public AddExerciseViewModel() {

    }
}

这里是控制器:

  public IActionResult WorkoutSelector() {
        IList<ExerciseType> exerciseTypes = context.ExerciseTypes.ToList();

        AddExerciseViewModel addExerciseViewModel1 = new AddExerciseViewModel(exerciseTypes);

        return PartialView("_WorkoutSelector", addExerciseViewModel1);
    }

这是ExerciseType类:

 public class ExerciseType
{
    public int ID { get; set; }

    public string Name { get; set; }

}

【问题讨论】:

  • 你正在传递IEnumerable&lt;ExerciseType&gt;,ExerciseType 是一个整数,所以基本上,你传递了一个可枚举的数字并期望从中得到IDName?你能澄清一下吗?
  • @Valkyrie 这被传递给构造函数以初始化ExercisesTypes 属性。它不一定会影响模型在视图中的可用性。
  • @rdev5 你读过我说的吗? ExerciseType 是模型本身的整数外观。如何从整数中获取 Id 和 Name?
  • @Valkyrie 对不起,我还是没听懂你说的。听起来您将属性 AddExerciseViewModel.ExerciseType (不是类型)与该项目其他地方定义的 ExerciseType 类(确实定义了 IDName 属性)混淆了OP 包含在这些 sn-ps 中。此外,为什么有人会为int 使用这样的不同名称而麻烦,这是没有道理的。当他们想要int 类型时,OP 清楚地知道如何指定intAddExerciseViewModel 中有 5 个)。
  • 他应该已经添加了足够的信息或有正确的命名。回答这些类型的问题还不够明确,这会产生更多问题。 Read This

标签: c# asp.net-mvc asp.net-core razor asp.net-mvc-viewmodel


【解决方案1】:

我通常不会在我的控制器中创建 ActionResult 方法来呈现局部,所以我不能直接谈论围绕 MVC 管道的情有可原的情况。

然而,鉴于一个传统的 ASP.NET MVC 项目,我倾向于不通过调用操作来呈现我的部分,而是在我的视图中包含使用 ViewBag 作为在上下文中向任何视图/部分补充额外数据的可靠替代方案根据需要。

~/Views/Workout/Welcome.cshtml

<div>
  <h2>Workout</h2>
  <p>Select your workout below:</p>

  @Html.Partial("~/Views/Shared/_WorkoutSelector.cshtml", ViewBag.MyExerciseViewModel);
</div>

然后在您的控制器中,只需在主要操作中加载您需要的任何内容并摆脱部分操作:

public class WorkoutController : Controller {
  ...

  public ActionResult Welcome() {
    ViewBag.MyExerciseViewModel = new AddExerciseViewModel(context.ExerciseTypes.ToList());

    return View();
  }
}

顺便问一下,您是否正确处理了DbContext? :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多