Установка флажка для контроллера MVC 5 / ASP.NET Core - PullRequest
0 голосов
/ 09 ноября 2018

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

Контроллер

[HttpPost]
public void SaveSettings(SettingsListModel SettingsModel)
{
    DataLayer dl = new DataLayer();

}

View

@model WebApplication1.Models.SettingsListModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="@Url.Content("~/Scripts/app.js")"></script>
    <title>Settings</title>
</head>
<body>
    <h1>Settings</h1>
    <div>
        <form asp-action="SaveSettings" asp-controller="Home" method="post">

            <div align="center">


                <div align="center">
                    @for (int i = 0; i < Model.listOfSettings.Count; i++)
                    {
                        @Html.HiddenFor(m => m.listOfSettings.ElementAt(i).settingID)
                        @Html.HiddenFor(m => m.listOfSettings.ElementAt(i).settingText)

                        <div>
                            @Html.DisplayTextFor(m => m.listOfSettings.ElementAt(i).settingText)
                        </div>
                        <div>
                            //@Html.HiddenFor(m => m.listOfSettings.ElementAt(i).settingsSelected)
                            @Html.CheckBoxFor(m => m.listOfSettings.ElementAt(i).settingsSelected)
                        </div>
                        <br />
                        <br />
                        <br />
                    }
                </div>
            </div>
            </form>
</div>

</body>
</html>

Модель

public class SettingsListModel
{
    public List<SettingsModel> listOfSettings { get; set; }
}

public class SettingsModel
{
    public int settingID { get; set; }

    public string settingText { get; set; }

    public bool settingsSelected { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Enumerable.ElementAt() возвращает тип (тип возвращаемого значения TSource), а не имя свойства, которое необходимо добавить в атрибут name. Вместо этого используйте индексатор свойств коллекции:

<form asp-action="SaveSettings" asp-controller="Home" method="post">
    <div align="center">
    <div align="center">
    @for (int i = 0; i < Model.listOfSettings.Count; i++)
    {
        @Html.HiddenFor(m => m.listOfSettings[i].settingID)
        @Html.HiddenFor(m => m.listOfSettings[i].settingText)

        <div>
        @Html.DisplayTextFor(m => m.listOfSettings[i].settingText)
        </div>
        <div>
        @Html.CheckBoxFor(m => m.listOfSettings[i].settingsSelected)
        </div> 
        <br />
        <br />
        <br />
    }
    </div>
    </div>

    <!-- add a button here to submit the form -->
    <button type="submit">Submit</button>
</form>

Версия помощника по тегам:

<form asp-action="SaveSettings" asp-controller="Home" method="post">
    <div align="center">
    <div align="center">
    @for (int i = 0; i < Model.listOfSettings.Count; i++)
    {
        <input asp-for="listOfSettings[i].settingID" type="hidden" />
        <input asp-for="listOfSettings[i].settingText" type="hidden" />

        <div>
        @Html.DisplayTextFor(m => m.listOfSettings[i].settingText)
        </div>
        <div>
        <input asp-for="listOfSettings[i].settingsSelected" type="checkbox" />
        </div> 
        <br />
        <br />
        <br />
    }
    </div>
    </div>

    <!-- add a button here to submit the form -->
    <button type="submit">Submit</button>
</form>

Также вам необходимо заменить тип возвращаемого значения с void на ActionResult (или IActionResult, если используется .NET Core):

[HttpPost]
public ActionResult SaveSettings(SettingsListModel SettingsModel)
{
    DataLayer dl = new DataLayer();

    // do something
    return View(model);
}
0 голосов
/ 09 ноября 2018

Вы не можете использовать .ElementAt() в своих выражениях - оно генерирует name атрибутов, которые не имеют отношения к вашей модели. Так как свойство List<T>, просто используйте индексатор коллекции

@for (int i = 0; i < Model.listOfSettings.Count; i++)
{
    @Html.HiddenFor(m => m.listOfSettings[i].settingID)
    @Html.HiddenFor(m => m.listOfSettings[i].settingText)
    <div>
        @Html.DisplayTextFor(m => m.listOfSettings[i].settingText)
    </div>
    <div>
        @Html.CheckBoxFor(m => m.listOfSettings[i].settingsSelected)
    </div>
}

В вашем элементе <form> также отсутствует кнопка отправки для отправки значений в контроллер.

...