将复选框发布到控制器 MVC 5/ASP.NET 核心
Posting checkbox to controller MVC 5/ ASP.NET Core
我正在尝试 post 将复选框信息返回给控制器,以便我可以保存更新数据库中的数据。目前,我在页面上拥有所有值,但是当我选中或取消选中该框时,它永远不会进入控制器。
控制器
[HttpPost]
public void SaveSettings(SettingsListModel SettingsModel)
{
DataLayer dl = new DataLayer();
}
查看
@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; }
}
您不能在表达式中使用 .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>
元素还缺少用于 post 控制器值的提交按钮。
Enumerable.ElementAt()
return是一个类型(它的return类型是TSource
),而不是属性必须加在[=15=中的名字] 属性。请改用集合 属性 索引器:
<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>
您还需要将 return 类型从 void
替换为 ActionResult
(如果使用 .NET Core,则为 IActionResult
):
[HttpPost]
public ActionResult SaveSettings(SettingsListModel SettingsModel)
{
DataLayer dl = new DataLayer();
// do something
return View(model);
}
我正在尝试 post 将复选框信息返回给控制器,以便我可以保存更新数据库中的数据。目前,我在页面上拥有所有值,但是当我选中或取消选中该框时,它永远不会进入控制器。
控制器
[HttpPost]
public void SaveSettings(SettingsListModel SettingsModel)
{
DataLayer dl = new DataLayer();
}
查看
@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; }
}
您不能在表达式中使用 .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>
元素还缺少用于 post 控制器值的提交按钮。
Enumerable.ElementAt()
return是一个类型(它的return类型是TSource
),而不是属性必须加在[=15=中的名字] 属性。请改用集合 属性 索引器:
<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>
您还需要将 return 类型从 void
替换为 ActionResult
(如果使用 .NET Core,则为 IActionResult
):
[HttpPost]
public ActionResult SaveSettings(SettingsListModel SettingsModel)
{
DataLayer dl = new DataLayer();
// do something
return View(model);
}