【问题标题】:Populating a List from a Database column从数据库列填充列表
【发布时间】:2019-07-09 16:45:27
【问题描述】:

我目前正在开发一个 asp.net mvc 项目,该项目允许用户从日历中仅选择可用日期来预订特定服务。我目前有一个 Datepicker.cs 模型,它包含一个 DateTime Date 字段和一个 int Id 字段,并且我有一个 DbContext 类,我用它来保存和检索这些数据

namespace Calendar.Models
{
  public class CalendarDb : DbContext
  {
    public DbSet<Datepicker> Dates { get; set; }
  }
}

我在我的 Create.cshtml 页面上使用 jQuery UI Datepicker 向用户显示可用日期。目前日历显示 2 个硬编码的可用日期。

现在我的问题是,是否可以在 asp.net mvc 框架中使用 Datepickers Db 中 Date 列中的所有日期填充这个硬编码数组(甚至是列表等)?即我需要日历来显示数据库中的所有可用日期

任何帮助将不胜感激!

我的 Datepicker 模型:

namespace Calendar.Models
{
  public class Datepicker
  {
    public DateTime DtmDate { get; set; }
    public int Id { get; set; }
    public int UserId { get; set; }
  }
}

视图控制器:

    [HttpGet]
    public ActionResult Create()
    {
       var model = _db.Dates.ToList();
       return View(model);
    }

我的 Create.cshtml 视图:

@model Calendar.Models.Datepicker

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
    <h4>Datepicker</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.DtmDate, htmlAttributes: new { @class 
= "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.DtmDate, new { htmlAttributes = 
new { @class = "form-control1" } })
            @Html.ValidationMessageFor(model => model.DtmDate, "", new { 
@class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.UserId, htmlAttributes: new { @class = 
"control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.UserId, new { htmlAttributes = 
new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.UserId, "", new { 
@class = "text-danger" })
         </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

<link href="~/Content/themes/base/jquery-ui.min.css" rel="stylesheet" />

@section scripts {
<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
<script>
    jQuery(function(){
        var enableDays = ["11-07-2019", "12-07-2019"];

        function enableAllTheseDays(date) {
            var sdate = $.datepicker.formatDate('dd-mm-yy', date)
            console.log(sdate)
            if ($.inArray(sdate, enableDays) != -1) {
                return [true];
            }
            return [false];
        }

        $(".form-control1").datepicker({
            dateFormat: "dd/MM/yy",
            beforeShowDay: enableAllTheseDays

        });
    });

</script>

@Scripts.Render("~/bundles/jqueryval")
}

<style>
.my-class a {
     background-color: #07ea69 !important;
     background-image :none !important;
     color: #ffffff !important;
}
</style>

【问题讨论】:

  • 我不明白你卡在哪一部分。您似乎知道如何将数据从数据库中获取到您的应用程序中。您是否将其放入传递给视图的模型中?您知道如何从视图中的模型中获取值并在 JavaScript 中使用它们吗?您需要哪些具体部分的帮助?
  • 是的,您可以将列表从代码传递并使用到视图中。其他明智的将该列表转换为 javascript 列表并使用它。
  • @Craig, "stackoverflow.com/questions/9480537/…" 帖子可能会有所帮助。
  • @mason 嗨,伙计,谢谢您的回复。是的,我将 Datepicker 模型传入视图(@model Calendar.Models.Datepicker)。至于获取视图中的值并利用它们,即将日期放入某个排序集合以供 Datepicker 使用,我不太确定如何实现。任何帮助将不胜感激
  • 您定义了一个包含启用天数的 JSON 数组。现在这是硬编码的,但是您想使用模型中的值吗?您可以简单地使用 Razor 语法从模型中获取值并将它们插入到标记中,而不是硬编码值。

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


【解决方案1】:

您的模型类型是一个列表,因为您的控制器中有 var model = _db.Dates.ToList(); 行。您需要调整视图的模型声明以匹配。

改变

@model Calendar.Models.Datepicker

@model List<Calendar.Models.Datepicker>

现在您的模型类型正确,您可以将日期嵌入到 JavaScript 中。我们需要使用 Linq 选择日期,并将它们转换为 JS 期望的正确字符串格式,然后使用一些字符串方法将它们连接在一起。改变这个:

var enableDays = ["11-07-2019", "12-07-2019"];

var enableDays = [' @Html.Raw(string.Join("','", Model.Select(d => d.DtmDate.ToString("MM-dd-yyyy"))) '];

然后全部运行。在呈现的 HTML 中,您应该看到数据库中的日期很好地嵌入到 JavaScript 中,这应该会在您的日期选择器中启用正确的日期。显然,您需要处理边缘情况,例如表中没有行,或者其中一行中的日期为空。但这应该可以帮助您入门。

【讨论】:

  • 你是救命稻草,我回家后会实施。感谢您的宝贵时间!
  • 我将模型更改为 List 类型,尽管现在 Html 帮助器 'LabelFor' 和 'EditorFor' 将不起作用,因为我认为他们期待的是模型而不是列表。错误如下:“List”不包含“DtmDate”的定义(与 UserId 相同)。有没有快速解决这个问题的方法?因为我仍然需要一个标签和字段供用户选择他们的日期。再次感谢梅森的帮助!
  • @Craig 当然有一个快速修复。您需要决定您的视图是否需要单个 Datepicker 或 List 传递给它。如果它需要一个列表,那么直接使用 LabelFor 和 EditorFor 是行不通的。花点时间坐下来,真正规划一下视图的用途,它应该有什么输入(模型),以及应该从中得出什么结果(表单值)。
  • 视图应该允许用户使用日历来选择一个可用的日期,然后这个日期将被存储到不同的预订表中。我只是认为必须将日期列表传递到视图中,以便使用所有可用日期填充日历。是否可以将 Datepicker 模型传递到视图中并使用它从分贝?
  • 或者有没有办法在不使用 labelFor/editorFor 的情况下存储用户选择的日期,这样我仍然可以传入列表?
【解决方案2】:

这里有一个关于如何做到这一点的想法。

首先创建一个返回List&lt;DateTime&gt;的方法 例子

 [HttpPost]
    public ActionResult GetDates()
    {

        return Json(CalendarDb.Dates.Select(x=> x.DtmDate.ToString("dd-MM-yyyy")));
    }

现在,当您创建 datepickider 时,您将需要此列表,例如 enableDays

var enableDays = [];
 $.ajax({
  url: "/GetDates",
  method: "POST" ,// post or get
  async: false,
  success:function(dates){ enableDays =dates; }
});

// now create your DatePicker.

现在如果你想要一个 mvc modol 解决方案,你可以这样做。

创建一个包含日期的模型,并将其简单地转换为 json

enableDays  =@Html.Raw(Json.Encode(modol.Dates.ToString("dd-MM-yyyy")))
// now create your DatePicker.

【讨论】:

  • 感谢您的回复!我试过: [HttpGet] public ActionResult Create() { return Json(_db.Dates.Select(x => x.DtmDate), JsonRequestBehavior.AllowGet); }。尽管现在当我查看视图时,屏幕上会显示原始日期。 i.ibb.co/XDP6vmj/rawdates.jpg
  • 好的,我看到格式错误。我编辑了我的答案,尝试x.DtmDate.ToString("dd-MM-yyyy") 这将返回正确的格式供您使用。并在此处阅读有关如何格式化日期时间docs.microsoft.com/en-us/dotnet/api/…
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多