MVC - Добавление элемента в список в модели при отправке формы

Я пытаюсь динамически добавлять элементы в список и отображать эти элементы в моем контроллере после отправки, но сейчас я даже не могу отобразить существующие элементы списка.

Я не на 100% в чем проблема, но, похоже, что-то связано с частичным представлением каждого элемента.

ViewModels:

public class UserGroupVM
{
    public int Id { get; set; }
    [Required]
    [Display(Name = "Usergruppe")]
    public string Name { get; set; }
    [Display(Name = "Beschreibung")]
    public string Description { get; set; }
    [Required]
    public Boolean IsGlobal { get; set; }
    public List<Employee_UserGroupVM> Employees { get; set; }
}

public class Employee_UserGroupVM
{
    public int Id { get; set; }
    [Display(Name = "Kennung")]
    public string SamAccountName { get; set; }
    [Display(Name = "Name")]
    public string LastnameFirstName { get; set; }
    [Display(Name = "Admin")]
    public bool IsAdmin { get; set; }
}

Форма-View:

@model DAKCrmImport.Web.Models.UserGroupVM

@{
    ViewBag.Title = "_UserGroup";
}

@using (Html.BeginForm("Save", "UserGroup", FormMethod.Post, new { Id = "form-usergroup-add", novalidate = "false" }))
{
    <fieldset>
        <div class="container-form-clear">
            <a class='button form-clear' title='Formular leeren'>button clear</a>
        </div>
        @Html.HiddenFor(model => model.Id)
        @Html.LabelFor(model => model.Name, new { @class = "label req" })
        @Html.TextBoxFor(model => model.Name, new { @class = "input"})
        @Html.LabelFor(model => model.Description, new { @class = "label" })
        @Html.TextAreaFor(model => model.Description, new { @class = "input", rows = "3", cols = "25" })
        <br />

        <a class='button form-add' title='MA-Berechtigung hinzufügen' id="bt-employee-add">button employee-add</a>
        @for (int i = 0; i < Model.Employees.Count(); i++)
        {
            @Html.EditorFor(m => m.Employees[i]);
        }

        <input type="submit" name="submit" class="submit form-button" value="Speichern" id="bt-submit-usergroup" />
    </fieldset>
}

Частичный вид:

@model DAKCrmImport.Web.Models.Employee_UserGroupVM

@{
    ViewBag.Title = "_EmployeeList";
}
<div class="div-employee-add">
    <div class="container-right">
        <a class="button form-remove-employee" title="MA entfernen" id="bt-employee-delete">button ma-remove</a>
    </div>
    <div class="container-left">
        @Html.LabelFor(model => model.SamAccountName)
        @Html.TextBoxFor(model => model.SamAccountName, new { @class = "textbox-samaccountname" })
        @Html.TextBoxFor(model => model.LastnameFirstName, new { @class = "textbox-lastnamefirstname", disabled = "disabled" })
        @Html.LabelFor(model => model.IsAdmin)
        @Html.CheckBoxFor(model => model.IsAdmin, new { @class = "checkbox-isadmin" })
    </div>
</div>

контроллер:

public virtual ActionResult BlankEmployeeRow()
{
    return PartialView("EditorTemplates/Employee_UserGroupVM", new Employee_UserGroupVM());
}
public virtual ActionResult Save(UserGroupVM usergroup)
{
    return null;
}

Пока я заметил только то, что Employees появляются в контроллере, если я не использую частичное представление и отображаю его переменные посредством индексации. Поскольку я не могу выполнить какую-либо индексацию в самом частичном представлении, это не работает сейчас. Я понятия не имею, как это исправить, и сомнительно, появятся ли новые или отредактированные элементы в любом случае.

Я бы очень признателен за небольшую помощь.

PS Я знаю, как читать модель через jQuery, но я хочу использовать собственный метод отправки форм MVC без дополнительного кода.

[Обновить] Я создал EditorTemplate из своего частичного представления, и теперь существующие сотрудники отправлены, но дополнительные сотрудники все еще не отправлены. Даже если они появляются в разметке...

Добавление новых предметов через jquery/ частичное представление:

$(document).on('click', '#bt-employee-add', function () {
    var lastDiv = $("[class~='div-employee-add']").first();
    var lastTextBox = $(lastDiv).find("[class~='textbox-lastnamefirstname']");

    var url = $("#EmployeeAdd").data('request-url');
    var params = null;

    if (lastTextBox.val() == "") {
        //Notification
    } else {
        $(getJSONfromController(url, params, null, true)).insertBefore($(".div-employee-add").first());
    }
});

2 ответа

Решение

Попробуй это:

@Html.Partial("_EmployeeList", Model.Employees, new ViewDataDictionary
{
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Employees" }
})

Проблема в том, что частичное не знает имя списка, поэтому вы должны указать его явно.

Когда вы используете простую ViewModel, ваши данные не будут обновляться динамически, так как ваша страница не будет опрашивать ваш сервер. Он будет получать только новые данные при обновлении.

Вам нужно будет либо использовать таймер для опроса, либо заглянуть в угловой, нокаут или тлеющий уголь.

Другие вопросы по тегам