Aspnet Core-无法在表单上显示日期

时间:2019-03-21 14:28:20

标签: c# asp.net-mvc asp.net-core

我正在制作一个行使aspnet核心的系统。

在系统中,我有一个交易记录器,该记录器已经可以正常工作,并且此时我可以选择编辑在系统中注册的交易记录,当我单击“编辑”时,会出现一个带有旧表格的表格数据已填充,其中一个是Data,但由于某种原因我无法显示日期。

我已经做了一些检查,

-单击“编辑”时,URL将传递项目ID。在TransactionModel模型中,正确传递了logging_user_id和项目的ID。

-正确添加了LoadStatus方法的item对象中添加的每个变量。

但是由于某种原因,当它到达View时,变量不采用值,它们保持为0或为空

查看

@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>

控制器

[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;
        }

如果此数据不足,请让我知道我分享了更多信息。

我的代码是here

1 个答案:

答案 0 :(得分:1)

您使用的输入类型为“日期”,但输入的值为dd/mm/yyyy。日期输入类型需要ISO值:YYYY-MM-DD。如果它无法解析作为ISO日期提供的值,则默认不显示任何内容。

也就是说,您真的需要在所有这些方面重返校园。您没有正确利用视图模型,而是将所有内容都作为字符串处理,这不仅更容易出错,而且基本上消除了自动进行的大量验证。例如,如果您绑定到类型DateTime的属性,则如果发布的值不能转换为DateTime,则用户将自动获得错误。而将其键入为字符串,则无论日期如何,都允许 any 值。如果您认为使用日期输入类型可以解决问题,那就错了。这可以由恶意用户修改,甚至在最佳情况下,并非每个浏览器都支持该输入类型,默认回退是标准文本输入类型,该类型允许任何输入。我鼓励您仔细阅读ASP.NET Core文档。