ASP.NET MVC: преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона - PullRequest
0 голосов
/ 31 августа 2018

Когда я нажимаю на кнопку, чтобы сделать запись в базе данных, я получаю эту ошибку:

SqlException: преобразование типа данных datetime2 в тип данных datetime привело к значению, выходящему за пределы допустимого диапазона.

Может ли кто-нибудь мне помочь?

image

Контроллер:

   // GET: Reservas/Create
    public ActionResult Create()
    {

        using (var ctx = new HotelEntities())
        {

            var quarto = ctx.Database.SqlQuery<int>("SELECT DISTINCT Quarto.ID_Quarto FROM Quarto LEFT JOIN Reserva ON Quarto.ID_Quarto = Reserva.ID_Quarto WHERE Reserva.ID_Quarto IS NULL OR NOT EXISTS(SELECT 1 FROM Quarto Q2 LEFT JOIN Reserva R2 ON Q2.ID_Quarto = R2.ID_Quarto WHERE Quarto.ID_Quarto = Q2.ID_Quarto AND R2.DataEntrada <= GETDATE() AND(R2.DataSaida IS NULL OR R2.DataSaida > GETDATE()))").ToList();
            ViewBag.ID_Quarto = new SelectList(quarto, "ID_Quarto");
        }

        ViewBag.ID_Cliente = new SelectList(db.Cliente, "ID_Cliente", "Nome");

        return View();
    }

    // POST: Reservas/Create
    // Para se proteger de mais ataques, ative as propriedades específicas a que você quer se conectar. Para 
    // obter mais detalhes, consulte https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Reserva reserva)
    {
        if (ModelState.IsValid)
        {
            db.Reserva.Add(reserva);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.ID_Cliente = new SelectList(db.Cliente, "ID_Cliente", "Nome", reserva.ID_Cliente);
        ViewBag.ID_Quarto = new SelectList(db.Quarto, "ID_Quarto", "TipoQuarto", reserva.ID_Quarto);
        return View(reserva);
    }

Класс модели:

public partial class Reserva
{
        public int ID_Reserva { get; set; }
        public int ID_Cliente { get; set; }
        public int ID_Quarto { get; set; }
        public System.DateTime DataEntrada { get; set; }
        public Nullable<System.DateTime> DataSaida { get; set; }
        public int NumeroPessoas { get; set; }
        public Nullable<int> NumeroNoites { get; set; }
        public Nullable<decimal> Preço { get; set; }
        public string Observaçoes { get; set; }

        public virtual Cliente Cliente { get; set; }
        public virtual Quarto Quarto { get; set; }
}

1 Ответ

0 голосов
/ 01 сентября 2018

Исходя из вашего предыдущего вопроса здесь и текущего кода представления в скрипте, очевидно, что вы используете Html.BeginForm() неправильно. Вы на самом деле помещаете только кнопки внутри Html.BeginForm():

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <button type="submit" class="btn btn-success btn-circle btn-xl" data-toggle="tooltip" title="Registar"> <i class="glyphicon glyphicon-floppy-disk"></i></button>
    <button type="button" onclick="location.href='@Url.Action("Index", "Reservas")'" class="btn btn-primary btn-circle btn-xl" data-toggle="tooltip" title="Voltar"><i class="glyphicon glyphicon-arrow-left"></i></button>
}

Поскольку форма содержит только кнопки, любые другие пользовательские входные значения не передаются во время процедуры POST, а свойство DateTime (то есть DataEntrada), которому не присваивается значение, присваивается значение по умолчанию (DateTime.MinValue), которое находится вне минимальное связанное значение типа даты SQL DATETIME (обратите внимание, что эквивалент C # DateTime равен DATETIME2) и запуск SqlException.

Что вам нужно сделать, это поместить Html.BeginForm() сразу после директивы @model, чтобы все элементы ввода формы помещались внутри формы и использовали строго типизированные HTML-помощники для всех элементов ввода, объявленных внутри класса viewmodel:

@model WebApplication.Models.BaseDados.ReservaVM

@using (Html.BeginForm("Create", "ControllerName", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <div class="container-fluid">
        <div class="container">
            <div class="formBox">           
                    <div class="row">
                        <div class="col-sm-12">
                            <h1>Registo de Reservas</h1>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6">
                            <div class="inputBox ">
                                <div class="inputText">Nome*</div>
                                @Html.DropDownListFor(model => model.ID_Cliente, null, new { @class = "input" })
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Telemóvel</div>
                                @Html.TextBoxFor(model => model.Telemovel, new { @class = "input", id = "txtTelemovel" })
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Cartão Cidadão</div>
                                @Html.TextBoxFor(model => model.CartaoCidadao, new { @class = "input", id = "txtCartaoCidadao" })
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="inputBox ">
                                <div class="inputText">ID Quarto</div>
                                @Html.DropDownListFor(model => model.ID_Quarto, null, new { @class = "input" })
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Data Entrada*</div>
                                @Html.TextBoxFor(model => model.DataEntrada, new { @class = "input" })
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Data Saída</div>
                                @Html.TextBoxFor(model => model.DataSaida, new { @class = "input" })
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6">
                            <div class="inputBox ">
                                <div class="inputText">Nº Pessoas*</div>
                                @Html.TextBoxFor(model => model.NumeroPessoas, new { @class = "input" })
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Nº Noites</div>
                                @Html.TextBoxFor(model => model.NumeroNoites, new { @class = "input", id = "Noites" })
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Preço</div>
                                @Html.TextBoxFor(model => model.Preco, new { @class = "input" })
                                <br /><br /><br />
                                <div>*Campos Obrigatórios</div>
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="inputBox">
                                <div class="inputText">Observações</div>
                                @Html.TextAreaFor(model => model.Observaçoes, new { @class = "input" })
                            </div>
                        </div>
                    </div>
                    <div class="col-md-12">
                        <center>
                        <button type="submit" class="btn btn-success btn-circle btn-xl" data-toggle="tooltip" title="Registar"> <i class="glyphicon glyphicon-floppy-disk"></i></button>
                        <button type="button" onclick="location.href='@Url.Action("Index", "Reservas")'" class="btn btn-primary btn-circle btn-xl" data-toggle="tooltip" title="Voltar"><i class="glyphicon glyphicon-arrow-left"></i></button>
                        </center>
                    </div>               
            </div>
        </div>
    </div>
}

Затем установите обязательные поля для свойств модели представления с помощью аннотаций данных (т. Е. RequiredAttribute):

Модель

public class ReservaVM
{
    public int ID_Reserva { get; set; }

    [Required]
    public int ID_Cliente { get; set; }
    public int ID_Quarto { get; set; }
    public string Telemovel { get; set; }
    public string CartaoCidadao { get; set; }

    [Required]
    public Nullable<System.DateTime> DataEntrada { get; set; }
    public Nullable<System.DateTime> DataSaida { get; set; }

    [Required]
    public int NumeroPessoas { get; set; }
    public Nullable<int> NumeroNoites { get; set; }
    public Nullable<decimal> Preço { get; set; }
    public string Observaçoes { get; set; }
}

Контроллер

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ReservaVM reserva)
{
    // do something
    return View(reserva);
}

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

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