Aspnet Core - не удалось отобразить дату в форме - PullRequest
0 голосов
/ 21 марта 2019

Я делаю систему для работы с ядром aspnet.

В системе у меня есть регистр транзакций, который уже работает правильно, и в этот момент я делаю возможность редактировать транзакцию, которая былаЗарегистрированные в системе, когда я нажимаю на кнопку «Изменить», появляется форма с заполненными старыми данными, одна из которых «Данные», но по какой-то причине я не могу показать дату.

Я уже сделал несколько проверок, которые:

-Когда я нажимаю изменить, идентификатор элемента передается по URL.В модели TransactionModel logged_user_id и id элемента передаются корректно.

-Каждая переменная, которая добавляется в объект элемента в методе LoadStatus, добавляется правильно.

Но для некоторыхпричина, когда она приходит в View, переменные не принимают значения, они остаются 0 или пустыми

View

@model TransacaoModel

    <h3>Registrar Transação</h3>

    @{
        var vData = "";
        var vDescricao = "";
        var vTipo = "";
        var vValor = 0;
        var vId = 0;
        var vContaId = 0;
        var vPlanoContaId = 0;

        try
        {
            vId = int.Parse(ViewBag.Registro.Id.ToString());
            vData = DateTime.Parse(ViewBag.Registro.Data.ToString());
            vContaId = int.Parse(ViewBag.Registro.Conta_Id.ToString());
            vValor = double.Parse(ViewBag.Registro.Valor.ToString());
            vPlanoContaId = int.Parse(ViewBag.Registro.Plano_Contas_Id.ToString());
            vDescricao = ViewBag.Registro.Descricao.ToString();
            vTipo = ViewBag.Registro.Tipo.ToString();

        }
        catch
        {

        }
    }

    <form asp-controller="Transacao" asp-action="Registrar">
        <input type="hidden" asp-for="Id" value="@vId" />

        <div class="form-group">
            <label>Data:</label>
            <input type="date" class="form-control" asp-for="Data" value="@vData" />
            <span asp-validation-for="Data" class="text-danger"></span>
        </div>

Controller

[HttpGet]
        public IActionResult Registrar(int? id)
        {
            if (id != null)
            {
                TransacaoModel objTransacao = new TransacaoModel(HttpContextAccessor);
                ViewBag.Registro = objTransacao.CarregarRegistro(id);
            }
            ViewBag.ListaContas = new ContaModel(HttpContextAccessor).ListaConta();
            ViewBag.ListaPlanoContas = new PlanoContaModel(HttpContextAccessor).ListaPlanoConta();
            return View();
        }

Модель

public TransacaoModel CarregarRegistro(int? id)
        {
            TransacaoModel item;

            string id_usuario_logado = HttpContextAccessor.HttpContext.Session.GetString("IdUsuarioLogado");
            string sql = "select t.Id, t.Data, t.Tipo, t.Valor, t.Descricao as historico , t.Conta_Id, c.Nome as conta, " +
                        " t.Plano_Contas_Id, p.Descricao as plano_conta from transacao as t inner join conta c " +
                        " on t.Conta_Id = c.Id inner join Plano_Contas as p " +
                        " on t.Plano_Contas_Id = p.Id " +
                        $" where t.Usuario_Id={id_usuario_logado} and t.Id='{id}'";
            DAL objDAL = new DAL();
            DataTable dt = objDAL.RetDataTable(sql);

            item = new TransacaoModel();
            item.Id = int.Parse(dt.Rows[0]["ID"].ToString());
            item.Data = DateTime.Parse(dt.Rows[0]["Data"].ToString()).ToString("dd/mm/yyyy");
            item.Descricao = dt.Rows[0]["historico"].ToString();
            item.Valor = double.Parse(dt.Rows[0]["Valor"].ToString());
            item.Conta_Id = int.Parse(dt.Rows[0]["Conta_Id"].ToString());
            item.NomeConta = dt.Rows[0]["conta"].ToString();
            item.Plano_Contas_Id = int.Parse(dt.Rows[0]["Plano_Contas_Id"].ToString());
            item.DescricaoPlanoConta = dt.Rows[0]["plano_conta"].ToString();
            item.Tipo = dt.Rows[0]["TIPO"].ToString();

            return item;
        }

Если этих данных недостаточно, просто дайте мне знать, что я делюсь больше.

Мой код здесь

1 Ответ

1 голос
/ 21 марта 2019

Вы используете тип ввода "date", но вы указываете значение dd/mm/yyyy.Тип ввода даты требует значений ISO: YYYY-MM-DD.Если он не может проанализировать значение, указанное в качестве даты ISO, по умолчанию он вообще ничего не показывает.

Тем не менее, вам действительно нужно вернуться в школу по всем этим вопросам.Вы не используете свою модель представления правильно, и вы обрабатываете все как строки, что не только более подвержено ошибкам, но и в основном удаляет тонну проверки, которая автоматически добавляется.Например, если вы связываетесь со свойством типа DateTime, пользователь автоматически получит ошибку, если опубликованное значение не может быть преобразовано в DateTime.Принимая во внимание, что при вводе в виде строки любое значение будет разрешено, независимо от того, является ли это датой.Если вы думаете, что используете тип ввода даты, вы ошибаетесь.Это может быть изменено злонамеренным пользователем или даже в лучшем случае, не каждый браузер поддерживает этот тип ввода, и резервным вариантом по умолчанию является стандартный тип ввода текста, который допускает любой ввод.Я бы посоветовал вам полностью прочитать документацию по ASP.NET Core .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...