【问题标题】:Why doesn't asp.net core model binding work?为什么asp.net核心模型绑定不起作用?
【发布时间】:2020-04-16 14:50:02
【问题描述】:

这是我的看法

@model MyProject.ViewModel.CourseViewModel

@{
    ViewData["Title"] = "AddCourseView";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Add Course</h1>

<div class="row">
    <div class="col-md-12">
        <form method="post">
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Course.CourseName"></label>
                <input asp-for="Course.CourseName" class="form-control" />
                <span asp-validation-for="Course.CourseName" class="text-danger"></span>
            </div>
            <label>Select lecturers to the course</label>
            @{
                var lst = Model.List;
                @for (int i = 0; i<lst.Count(); i++)
                {
                    var lecturer = lst.ElementAt(i);
                    <div class="checkbox">
                        <label><input type="checkbox" value="" id="checkbox @i" asp-for=@lecturer.IsChecked>@lecturer.LecturerId</label>
                    </div>


                }

                @if (lst.Count() == 0)
                {
                    <div class="checkbox">
                        <span class="badge badge-danger" style="font-size:medium">Lecturers list is empty</span>
                    </div>
                }
            }
            <p></p>
            <button type="submit" class="btn btn-primary">Create</button>
        </form>
        </div>
    </div>


视图调用 AddCourse

这是我的控制器:

  [HttpGet]
        public IActionResult AddCourse()
        {
            var lst = userService.GetAllLecturers();
            CourseViewModel courseViewModel = new CourseViewModel();
            courseViewModel.List = new List<IsCheckedLecturer>();

            foreach(var lecture in lst)
            {
                courseViewModel.List.Add(new IsCheckedLecturer
                {
                    IsChecked = false,
                    LecturerId = lecture.UserId
                });
            }


            return View(courseViewModel);
        }

        [HttpPost]
        public IActionResult AddCourse(CourseViewModel viewModel)
        {
            return View(viewModel);
        }

HttpGet 工作正常,但是 HttpPost 方法(第二种方法)得到一个空列表而不是从视图中获取模型(通过模型绑定)

这是课程视图模型

    public class CourseViewModel
    {
        public Course Course { get; set; }
        public IList<IsCheckedLecturer> List { get; set; }

    }

    public class IsCheckedLecturer
    {
        public bool IsChecked { get; set; }
        public string LecturerId { get; set; }
    }

为什么模型绑定不起作用?以及我如何解决它? 也许是因为它的复杂视图模型?

【问题讨论】:

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


    【解决方案1】:

    您的问题不是很清楚,但我假设您的意思是viewModelList 属性为空,而不是viewModel 本身。原因是您没有正确绑定输入。

    var lst = Model.List;
    @for (int i = 0; i<lst.Count(); i++)
    {
        var lecturer = lst.ElementAt(i);
        <div class="checkbox">
            <label><input type="checkbox" value="" id="checkbox @i" asp-for=@lecturer.IsChecked>@lecturer.LecturerId</label>
        </div>
    }
    

    上面的代码将导致输入名称为lecturer.IsChecked。当它返回服务器端时,没有任何东西可以绑定它(没有lecturer 参数),所以模型绑定器只是删除它,让你的List 属性为空。

    相反,您需要将代码更改为:

    @for (int i = 0; i < Model.List.Count(); i++)
    {
        <div class="checkbox">
            <label><input type="checkbox" id="checkbox@i" asp-for="List[i].IsChecked">@Model.List[i].LecturerId</label>
        </div>
    }
    

    这样,输入的名称最终将类似于List[0].IsChecked,然后将绑定到模型上的List 属性。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多