У меня есть поле флажка в моей форме. когда форма редактируется и повторно отправляется, значение флажка, всегда передаваемого контроллеру, равно false. Я использую ASP.Net MVC Core 2.2.
Изменить.cshtml
<form asp-action = "Edit">
<table>
<tr>
<td><label for = "default">Default</label></td>
<td>@Html.CheckBoxFor(m => m.IsDefault, new { @checked = "checked", @class = "form-input-styled" })</td>
</tr>
<tr>
<td><label for = "standard">Standard</label></td>
<td>@Html.CheckBoxFor(m => m.IsStandard, new { @checked = "checked", @class = "form-input-styled" })</td>
</tr>
<tr>
<td><label for = "emailed">Emailed</label></td>
<td>@Html.CheckBoxFor(m => m.IsEmailed, new { @checked = "checked", @class = "form-input-styled" })</td>
</tr>
</table>
</form>
ViewModel.cs
public class ReprintEditViewModel
{
public bool IsDefault { get; set; }
public bool IsStandard { get; set; }
public bool IsEmailed { get; set; }
}
Контроллер.cs
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Date,PolicyNumber,OwnerName,SendTo,EmailAddress,ModifiedDate,LastModifiedBy,DeliveryMethod, Default, Standard, Emailed")] ReprintEditViewModel xrCertReprint)
{
if (ModelState.IsValid)
{
//string dm = string.Join(", ", DeliveryMethod);
string dm = "";
if (xrCertReprint.IsDefault == true)
dm = "Default";
if (xrCertReprint.IsStandard == true)
if (dm.Length > 1)
dm = dm + ", " + "Standard";
else
dm = "Standard";
if (xrCertReprint.IsEmailed == true)
if (dm.Length > 1)
dm = dm + ", " + "Emailed";
else
dm = "Emailed";
return RedirectToAction(nameof(Index));
}
return View(xrCertReprint);
}
Я пробовал другие решения/способы, перечисленные в stackoverflow. Ничего не получилось. Я не уверен, что я делал неправильно?
Большое спасибо @Manprit. Это сработало. Не возражаете, не могли бы вы объяснить, как работает удаление атрибута привязки?





В настоящее время вы используете приведенный ниже код для привязки данных:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Date,PolicyNumber,OwnerName,SendTo,EmailAddress,ModifiedDate,LastModifiedBy,DeliveryMethod, Default, Standard, Emailed")] ReprintEditViewModel xrCertReprint)
{
if (ModelState.IsValid)
{
//string dm = string.Join(", ", DeliveryMethod);
string dm = "";
if (xrCertReprint.IsDefault == true)
dm = "Default";
if (xrCertReprint.IsStandard == true)
if (dm.Length > 1)
dm = dm + ", " + "Standard";
else
dm = "Standard";
if (xrCertReprint.IsEmailed == true)
if (dm.Length > 1)
dm = dm + ", " + "Emailed";
else
dm = "Emailed";
return RedirectToAction(nameof(Index));
}
return View(xrCertReprint);
}
В то время как ваша модель ReprintEditViewModel имеет свойства IsDefault , IsStandard and IsEmailed, которые не включены в атрибут Bind. Таким образом, связыватель модели MVC будет игнорировать эти свойства и связывать только свойства, переданные в атрибуте. Если вы удалите атрибут Bind, то все свойства с тем же именем, что и в модели, будут привязаны из-за связывателя модели MVC по умолчанию, и вы получите значения.
Вы можете узнать больше о привязке модели, используя эта ссылка
Причина в том, что ваш атрибут [Bind] не содержит правильных названий свойств.
Атрибут [Bind] указывает, какие свойства модели должны быть включены в привязку модели.
Измените, чтобы использовать IsDefault, IsStandard, IsEmailed вместо Default, Standard, Emailed
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Date,PolicyNumber,OwnerName,SendTo,EmailAddress,ModifiedDate,LastModifiedBy,DeliveryMethod, IsDefault, IsStandard, IsEmailed")] ReprintEditViewModel xrCertReprint)
Удалите атрибут
[Bind]из вашего метода действий и попробуйте. Он должен работать :)