Флажки Razor всегда возвращают false в ASP.Net Core 2.2 MVC - PullRequest
0 голосов
/ 10 июля 2019

У меня есть поле флажка в моей форме. когда форма редактируется и повторно отправляется, значение для флажка, всегда передаваемого в контроллер, равно false. Я использую ASP.Net MVC Core 2.2.

Edit.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; }
}

Controller.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. Ничего не получилось. Я не уверен, что я делал не так?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Причина в том, что ваш атрибут [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)

См. https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.2#bind-attribute

1 голос
/ 10 июля 2019

В настоящее время вы используете следующий код для привязки данных:

[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, то все свойства, имеющие то же имя, что и в Model, будут связаны из-за привязки модели MVC по умолчанию, и вы получите значения.

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

...