Получить частичное представление данных на главном представлении представить - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть класс учителя и класс курсов.Я создаю форму редактирования для учителей, где пользователь может редактировать информацию учителя, такую ​​как имя, должность и курсы, которые преподает учитель.Я создал частичное представление для отображения информации о курсах для учителя.У меня есть только одна кнопка отправки в главном окне редактирования.Когда я отправляю форму и получаю объект учителя, объект его курсов становится пустым, хотя я обновил поле курса.Может кто-нибудь помочь мне здесь?

public class TeacherTemplate
{
  public int teacherId { get; set;}
  public string TeacherName { get; set; }
  public string TeacherCourses { get; set; }
  public CourseTemplate Courses 
  {
        get => TeacherCourses == null ? null : JsonConvert.DeserializeObject<CourseTemplate>(TeacherCourses);
        set => TeacherCourses = JsonConvert.SerializeObject(Courses);
    }
}
public class CourseTemplate
{
  public string CourseName {get; set; }
  public int courseId { get; set; }
  public bool Active { get; set; }
  public Subjects Subject { get; set;}
}
public class Subjects
{
  public string SubjectName { get; set; }
}

Основное представление редактирования для учителей

@model TeacherTemplate
@{
    ViewBag.Title = "EditTeacher";
}
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.TeacherName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ModuleTitle, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ModuleTitle, "", new { @class = "text-danger" })
            </div>
        </div>

         @Html.Partial("_editCourse", Model)
        @*@Html.Action("EditCourse", "TeacherTemplate", new { teacherTemplate = Model })*@


        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Курсы Частичное представление

@model TeacherTemplate

<script src="~/Scripts/jquery-3.3.1.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Courses.CourseName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Courses.CourseName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Courses.CourseName, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.Courses.Active, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Courses.Active, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Courses.Active, "", new { @class = "text-danger" })
            </div>
        </div>
        <button type="button" id="btnAddSubjects">Add Subject</button>
        if (Model.Courses.Subject.Count() > 0)
        {
            <div id="subjectContainer" class="form-group">
                @Html.LabelFor(model => model.Courses.Subject, htmlAttributes: new { @class = "control-label col-md-2" })
                @for (var i = 0; i < Model.Courses.Subject.Count(); i++)
                {
                    <div class="col-md-10">
                        @Html.TextAreaFor(m => m.Courses.Subject[i].SubjectName, new { htmlAttributes = new { @class = "form-control", @cols = 80, @rows = 50 } })
                    </div>
                }
            </div>
         }
    </div>
}

TeacherTemplateController - Здесь, когда вызывается метод EditTeacherПри нажатии кнопки «Отправить» в главном окне объект teacherTemplate правильно связывает всю информацию об учителе, но свойство TeacherCourses и свойство / объект Courses оба имеют значение null.

public ActionResult Index()
    {
        return View();
    }
public ActionResult EditTeacher(Guid teacherTemplateId)
            {
                var teacherTemplate= _teacherTemplateService.GetTeacherInfo(teacherTemplateId);
                return View(teacherTemplate);
            }

    [HttpPost]
            public ActionResult EditTeacher(TeacherTemplate teacherTemplate)
            {
                if (ModelState.IsValid)
                {
                    var teacherTemplate1 = _teacherTemplateService.UpdateTeacherInfo(teacherTemplate);
return RedirectToAction("EditTeacher", new { teacherTemplateId = teacherTemplate.teacherTemplateId });

            }
            public ActionResult EditCourse(TeacherTemplate teacherTemplate)
            {
                return PartialView("_editCourse", teacherTemplate);
            }

1 Ответ

0 голосов
/ 27 февраля 2019

Я отвечаю, потому что комментарии не подходят для того, что я пишу.Я по-прежнему предполагаю, что изменение способа вызова вашего частичного представления является вашим лучшим вариантом:

@Html.ActionLink("Edit Course", "EditCourse", new { Model.CurrentTeacherID })

Это, очевидно, требует, чтобы вы изменили свой метод действия в TeacherTemplateController (не те же самые переменные и аргументы, но у вас есть идея):

public ActionResult EditCourse(int teacherID)
{
    TeacherTemplate model = new TeacherTemplate(teacherID);
    return PartialView(model);
}

Обратите внимание, что для этого метода необходимо создать представление EditCourse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...