型号为“int”时,在Web上输入框作为“日期”(再次)

问题描述 投票:0回答:1

我决定在这里创建一个新帖子,而不是另一个有点令人困惑的帖子。 (Input box as "date" on web when model is "int"

在这篇文章中,我添加了我使用的代码。

问题是在SQL服务器中,字段FrDr的类型为int,我需要网页上的用户输入“date”类型的输入字段

如果我将[DataType(DataType.Date)]添加到模型中,我会自动获得输入日期类型。但如果我将它添加到Page Model中则不行

如何更改我的代码,以便用户获得类型为date的输入字段,将日期值保存为int到SQL。

MODEL AGR.CS

namespace DateTest.VismaModels {

    public partial class Agr {


        [Key]
        [Display(Name = "Actor")]
        public int AgrActNo { get; set; }

        public int AgrNo { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "From Date")]
        public int FrDt { get; set; }

    }
}

PAGE MODEL

   namespace DateTest.Pages {

    public class IndexModel : PageModel {
        private readonly DateTest.VismaModels.F0001Context _context;


        public IndexModel(DateTest.VismaModels.F0001Context context) {
            _context = context;
        }

        public bool ShowMessage => !string.IsNullOrEmpty(Message);

        [TempData]
        public string Message { get; set; }

        [BindProperty]
        public Agr AgrRow { get; set; }

        public async Task<IActionResult> OnGetAsync(int? id) {


            if (id == null) {
                Console.WriteLine("New");
                AgrRow = new Agr();
                AgrRow.AgrNo = _context.Agr.Select(q => q.AgrNo).DefaultIfEmpty(0).Max() + 1;
                //AgrRow.FrDt = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

            }
            if (!ModelState.IsValid) {
                //var errors = ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).ToList();
                var errors = string.Join(" | ", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage));
                Message += "Model not valid : " + errors;
                return Redirect("~/Activities/index");
            }
            return Page();
        }



        public async Task<IActionResult> OnPostSaveNewRowAsync() {


            if (!ModelState.IsValid) {
                //var errors = ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).ToList();
                var errors = string.Join(" | ", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage));
                Message += "Model not valid : " + errors;
                return Redirect("~/index");
            }


            _context.Add(AgrRow);

            try {
                await _context.SaveChangesAsync();
            } catch (DbUpdateConcurrencyException) {
                throw;

            }
            Message += "Saved";
            return RedirectToPage("/index");
        }


    }



}

RAZOR PAGE

@page
@model DateTest.Pages.IndexModel

@{
    ViewData["Title"] = "Activities";
}

<h2>Activities</h2>

@if (Model.ShowMessage) {<div class="alert alert-info alert-dismissible" role="alert">
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"></button>
        @Model.Message
    </div>
}

<p>
    <a asp-page="Create">Create New</a>
</p>

<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="AgrRow.AgrNo" />


    <table class="table">

        <tbody>

            <tr>

                <td><input asp-for="@Model.AgrRow.AgrActNo" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.FrDt" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.ToDt" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.FrTm" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.ToTm" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.CustNo" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.ProdNo" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.Descr" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.NoInvoAb" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.Price" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.Am" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.Fin" class="form-control" /></td>
                <td><input asp-for="@Model.AgrRow.Invo" class="form-control" /></td>
                <td>
                    <div class="form-group">
                                <button type="submit" value="Save New" asp-page-handler="saveNewRow" asp-route-id="@Model.AgrRow.AgrNo" class="btn btn-default">
                                    <i class="fa fa-save"></i>Create
                                </button>
                    </div>
                </td>
            </tr>
        </tbody>
    </table>
</form>

enter image description here

enter image description here

UPDATE

如果我将以下内容添加到页面模型中

public DateTime FrDt { get; set; }

并在这样的post方法中打印出结果

Console.WriteLine("FRDT = " + FrDt);
Console.WriteLine("AGRROW FRDT = " + AgrRow.FrDt);

我明白了

FRDT = 0001-01-01 00:00:00
AGRROW FRDT = 0
asp.net-mvc datetime model type-conversion razor-pages
1个回答
0
投票

我想到了。

在我的Agr模型中,我添加一个临时字段FrDt2,它是DateTime并使用[NotMapped]注释,因此它不会将它发送到sql

[NotMapped]
public DateTime FrDt2 { get; set; }

在我的Page模型中,我将FrDt2转换为int,然后将其添加到FrDt。

AgrRow.FrDt = int.Parse(AgrRow.FrDt2.ToString("yyyyMMdd"));

并且,为了在输入日期框中显示SQL中的现有项目,我将其转换回int,就像这样

AgrRow.FrDt2 = DateTime.ParseExact(AgrRow.FrDt.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);
© www.soinside.com 2019 - 2024. All rights reserved.