WedX - журнал о программировании и компьютерных науках

Частичный вид MVC не отображается из EditorTemplates

Я работаю над формой с родительско-дочерними отношениями (один ко многим), используя MVC 5/EF 6.1. Я пытаюсь отобразить дочерние элементы через частичное представление, которое не будет отображаться или выдавать мне какие-либо ошибки (при создании новой формы). Я попытался запустить отладчик и не увидел ничего плохого (хотя я уверен, что он есть).

Пока это то, что у меня есть:

Модели

public class Parent
{

    public int ParentID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Child> Childs { get; set; }

}
public class Child
{
    public int ChildID { get; set; }
    public int ParentID { get; set; }

    public string Name { get; set; }
    public string DOB { get; set; }
    public string Address { get; set; }

    public virtual Parent Parent { get; set; }
}

ViewModels

public class ParentVM
{

    public ParentVM()
    {
        //Children = new List<ChildVM>()
           // {
              //  new ChildVM(){Name="1", DOB="1", Address="1"},
              //  new ChildVM(){Name="1", DOB="1", Address="1"},
              //  new ChildVM(){Name="1", DOB="1", Address="1"},                    
            //};

         Children = new List<ChildVM>(); 
    }


    public int ParentID { get; set; }
    public int ChildID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string Name { get; set; }
    public string DOB { get; set; }
    public string Address { get; set; }

    public IList<ChildVM> Children { get; set; }

}

public class ChildVM
{
    public int ChildID { get; set; }
    public int ParentID { get; set; }

    public string Name { get; set; }
    public string DOB { get; set; }
    public string Address { get; set; }
}

Просмотр (созданный с помощью шаблонов: Индекс, Детали, Изменить, Создать, Удалить)

@model SomeNamespace.ViewModels.ParentVM
@{ViewBag.Title = "Create";}

<h2>Create</h2>

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

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


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

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


    <table border="1">
        <tr>
            <th>Name</th>
            <th>DOB</th>
            <th>Address</th>
        </tr>
        @Html.EditorFor(x => x.Children)
    </table>


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

<div>@Html.ActionLink("Back to List", "Index")</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")}

Частичный просмотр (Views/Shared/EditorTemplates/Child.cshtml)

@model SomeNamespace.Models.Child
<tr>
<td>
    @Html.EditorFor(model => model.Name)
</td>
<td>
    @Html.EditorFor(model => model.DOB)
</td>
<td>
    @Html.EditorFor(model => model.Address)
</td>

Controller (ParentsController.cs)

// GET: Parents/Create
    public ActionResult Create()
    {

        //var viewModel = new ParentVM
        //{
        //    Children =
        //        new List<ChildVM>()
        //    {                    
        //       new ChildVM() {Name="1", DOB="1", Address="1"},
        //       new ChildVM() {Name="1", DOB="1", Address="1"},
        //       new ChildVM() {Name="1", DOB="1", Address="1"}
        //    }
        //};

        return View(new ParentVM());
        //return View(viewModel);
    }

// POST: Parents/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ParentID,FirstName,LastName, Name")] ParentVM viewModel)
    {
        if (ModelState.IsValid)
        {


            var child = new Child()
            {
                //Name = viewModel.Name,
                //DOB = viewModel.DOB,
                //Address = viewModel.Address


            };


            var parent = new Parent()
            {
                //FirstName = viewModel.FirstName,
                //LastName = viewModel.LastName

            };

            db.Parents.Add(parent);
            db.Childs.Add(child);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(viewModel);
    }

Это то, что я вижу в исходном коде:

<table border="1">
        <tr>
            <th>Name</th>
            <th>DOB</th>
            <th>Address</th>
        </tr>

    </table>

Может типа не нравится? Я думал, вы можете использовать модель в частичном представлении (editorTemplates)??


  • Я предполагаю, что вы просто не включили этот код, но я нигде не вижу, чтобы вы на самом деле добавляли дочерние элементы (Children — пустой список). Вы получите результат, который видите с нулевыми детьми. 24.11.2014

Ответы:


1

Ваш ParentVM класс содержит свойство public IList<ChildVM> Children { get; set; }, но ваш EditorTemplate предназначен для @model SomeNamespace.Models.Child. Измените его на

@model SomeNamespace.Models.ChildVM

И переименуйте свой EditorTemplate, чтобы он соответствовал

Представления/Общие/EditorTemplates/ChildVM.cshtml

24.11.2014
  • Я пробовал это, пробовал с ParentVM. Я всегда дает мне тот же результат. 24.11.2014
  • Вам также необходимо изменить имя EditorTemplate, чтобы оно совпадало! Views/Shared/EditorTemplates/ChildVM.cshtml 24.11.2014
  • Хорошо, я только что переименовал свой шаблон редактора в ChildVM, и все равно получаю тот же результат. Кроме того, мои модели просмотра находятся в папке ViewModels, поэтому я изменил ее следующим образом: @model SomeNamespace.ViewModels.ChildVM 24.11.2014
  • Вы только что отредактировали свой вопрос и закомментировали создание новых объектов ChildVM в конструкторе ParentVM, так что список пуст, так что отображать нечего! 24.11.2014
  • Вы правы, я изменил его, и он возвращал ‹table border=1› ‹tr› ‹th›Name‹/th› ‹th›DOB‹/th› ‹th›Address‹/th› ‹/tr› 000 24.11.2014
  • Итак, теперь это работает! Потрясающий. Это было быстро. Так что я был довольно близко да для новичка? Как пока выглядит остальное, я знаю, что моему контроллеру (HttpPost) потребуется доработка для обновления базы данных. Я действительно ценю твою помощь. 24.11.2014
  • Несколько других комментариев. DOB Я предполагаю, что это DateOfBirth, так почему же это string, а не DateTime? Просто используйте @Html.TextBoxFor() для ваших string типов. Включение public int ParentID { get; set; } в модель представления кажется бессмысленным, и вы не включили свойство ID (необязательное в методе создания, поскольку оно не существует в базе данных, но может быть необходимо в форме редактирования). И удалите [Bind(Include="..")] из метода POST (на самом деле вы исключаете Children!). Вам никогда не придется использовать BindAttribute, если у вас есть модель представления. 24.11.2014
  • Потрясающий. Все хорошие моменты. Я тоже внесу эти изменения. Большое спасибо. Я очень ценю, что вы нашли время, чтобы помочь мне. Хорошего дня! 24.11.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]