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