Làm thế nào để thêm Date Picker Bootstrap 3 trên dự án MVC 5 bằng cách sử dụng công cụ Razor?


81

Tôi cần một số dòng hướng dẫn về cách cài đặt Date Picker Bootstrap 3 trên dự án MVC 5 sử dụng công cụ Razor. Tôi đã tìm thấy liên kết này ở đây nhưng không thể làm cho nó hoạt động trong VS2013.

Sao chép từ ví dụ trong liên kết sau ở trên, tôi đã thực hiện như sau:

            bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                  "~/Scripts/bootstrap.js",
                  "~/Scripts/bootstrap-datepicker.js",    // ** NEW for Bootstrap Datepicker
                  "~/Scripts/respond.js"));

        bundles.Add(new StyleBundle("~/Content/css").Include(
                  "~/Content/bootstrap.css",
                  "~/Content/bootstrap-datepicker.css",  // ** NEW for Bootstrap Datepicker
                  "~/Content/site.css"));

Sau đó, tôi đã thêm tập lệnh vào chế độ xem chỉ mục như sau

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

<script type="text/javascript">
    $('.datepicker').datepicker(); //Initialise any date pickers
</script>
}

Bây giờ, làm thế nào để gọi bộ chọn ngày ở đây?

   <div class="form-group input-group-sm">
    @Html.LabelFor(model => model.DropOffDate)
    @Html.TextBoxFor(model => model.DropOffDate, new { @class = "form-control", placeholder = "Enter Drop-off date here..." })
    @Html.ValidationMessageFor(model => model.DropOffDate)
</div>

Vui lòng cho chúng tôi xem mã cshtml / Razor của bạn mà bạn đang làm việc không hoạt động. Cảm ơn
Eric Bishard

Cảm ơn vi đa trả lơi. Tôi đã cập nhật bài đăng của mình cho phù hợp
Ben Junior

Tôi sẽ khởi động VS và xem liệu tôi có thể tìm ra nó!
Eric Bishard

Bạn đã sử dụng NuGet để thêm tệp hay bạn đã thêm chúng theo cách thủ công?
Mehdiway

waqar ahmed cho đến nay là giải pháp đơn giản nhất.
Dieglock

Câu trả lời:


79

Câu trả lời này sử dụng jQuery UI Datepicker , là một bao gồm riêng biệt. Có nhiều cách khác để làm điều này mà không cần bao gồm giao diện người dùng jQuery.

Đầu tiên, bạn chỉ cần thêm datepickerlớp vào hộp văn bản, ngoài form-control:

<div class="form-group input-group-sm">
    @Html.LabelFor(model => model.DropOffDate)
    @Html.TextBoxFor(model => model.DropOffDate, new { @class = "form-control datepicker", placeholder = "Enter Drop-off date here..." })
    @Html.ValidationMessageFor(model => model.DropOffDate)
</div>

Sau đó, để đảm bảo javascript được kích hoạt sau khi hộp văn bản được hiển thị, bạn phải đặt lệnh gọi datepicker trong hàm sẵn sàng của jQuery:

<script type="text/javascript">
    $(function () { // will trigger when the document is ready
       $('.datepicker').datepicker(); //Initialise any date pickers
    });
</script>

4
Vâng đây chính là làm thế nào tôi có mã của tôi ngay bây giờ và nó không làm việc
Eric Bishard

1
Đây là lý do tại sao tôi sử dụng Foundation! Tôi có điều tương tự bạn làm thế, tôi đã cố gắng '@class = 'hình thức kiểm soát datepicker'' & '@class = 'datepicker hình thức kiểm soát' và không có xúc xắc
Eric Bishard

3
Nếu ngẫu nhiên, bạn đang gọi nó ở dạng xem một phần, thì tập lệnh phải ở trong trang Chỉ mục hoặc nó sẽ không hoạt động nếu là dạng xem một phần. Đây cũng là một trong những vấn đề cố định
Bến Junior

Tôi có thể tự động hóa Razor để nếu có [DataType(DataType.Date)]định nghĩa trên một trường, nó sẽ tự động thêm datepickerlớp css và chạy js?
Shimmy Weitzhandler

1
Các mẫu MVC 5 mà tôi có trong Visual Studio 2015 không bao gồm Giao diện người dùng JQuery, vì vậy tôi khá chắc chắn rằng bạn phải cài đặt và tham khảo mẫu đó trước khi điều này hoạt động. Có một cuộc thảo luận đàng hoàng ở đây với các liên kết đến các hướng dẫn liên quan: forums.asp.net/t/...
Paul Angelno

61

Câu trả lời này chỉ đơn giản áp dụng type=datethuộc tính cho inputphần tử HTML và dựa vào trình duyệt để cung cấp bộ chọn ngày. Lưu ý rằng ngay cả trong năm 2017, không phải tất cả các trình duyệt đều cung cấp công cụ chọn ngày của riêng họ, vì vậy bạn có thể muốn cung cấp dự phòng.

Tất cả những gì bạn phải làm là thêm thuộc tính vào thuộc tính trong mô hình chế độ xem. Ví dụ cho biến Ldate:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
Public DateTime Ldate {get;set;}

Giả sử bạn đang sử dụng MVC 5 và Visual Studio 2013.


3
Đây là câu trả lời TỐT NHẤT! Có cách nào để chọn ngày giờ không? [DataType(DataType.DateTime)] public DateTime BirthDate { get; set; }không hiệu quả với tôi.
Yoda

2
Giải pháp đơn giản nhất là đây
Hoàng Trinh

26
Đó KHÔNG phải là câu trả lời chính xác! Giải pháp đó sẽ chỉ cho phép các lịch cụ thể của trình duyệt xuất hiện trên trình duyệt cho các trường ngày. Điều đó không liên quan gì đến plugin Bootstrap Datetime.
ilter

3
Điều này sẽ không hoạt động với IE 11 và FF 38. Chỉ Chrome mới xử lý được điều này.
Immirza,

1
Vấn đề khác với giải pháp này là khi chỉnh sửa trường ngày, tôi chỉ thấy "mm / dd / yyyy" thay vì giá trị ngày đã tồn tại.
Paul Angelno

19

Chỉ thêm hai dòng này trước thuộc tính datetime trong mô hình của bạn

[DataType(DataType.Date)] 
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

và kết quả sẽ là:Bộ chọn ngày trong ứng dụng MVC


Nhưng bạn sẽ sử dụng trong Chế độ xem? Tôi cố gắng TextBoxFor nhưng nó vẫn là một textbox
Harambe Attack Helicopter

Phương pháp này chỉ hoạt động trong một số trình duyệt như chrome.
Kazem

IE sẽ thất bại trong giải pháp của bạn!
immirza

Nếu ai đó gặp lỗi này: Không thể đọc thuộc tính 'msie' của undefined. Này cố định nó
ruben450

19

Tôi hy vọng điều này có thể giúp một người nào đó đang phải đối mặt với vấn đề tương tự của tôi.

Câu trả lời này sử dụng Plugin Bootstrap DatePicker , không có nguồn gốc cho bootstrap.

Đảm bảo bạn cài đặt Bootstrap DatePicker thông qua NuGet

Tạo một đoạn JavaScript nhỏ và đặt tên là DatePickerReady.js lưu nó trong Scripts dir. Điều này sẽ đảm bảo nó hoạt động ngay cả trong các trình duyệt không phải HTML5 mặc dù ngày nay rất ít.

if (!Modernizr.inputtypes.date) {
    $(function () {

       $(".datecontrol").datepicker();

    });
}

Đặt các gói

bundles.Add(New ScriptBundle("~/bundles/bootstrap").Include(
              "~/Scripts/bootstrap.js",
              "~/Scripts/bootstrap-datepicker.js",
              "~/Scripts/DatePickerReady.js",
              "~/Scripts/respond.js"))

bundles.Add(New StyleBundle("~/Content/css").Include(
              "~/Content/bootstrap.css",
              "~/Content/bootstrap-datepicker3.css",
              "~/Content/site.css"))

Bây giờ hãy đặt Datatype để khi EditorFor được sử dụng, MVC sẽ xác định những gì sẽ được sử dụng.

<Required>
<DataType(DataType.Date)>
Public Property DOB As DateTime? = Nothing

Mã chế độ xem của bạn phải là

@Html.EditorFor(Function(model) model.DOB, New With {.htmlAttributes = New With {.class = "form-control datecontrol", .PlaceHolder = "Enter Date of Birth"}})

và Voila

nhập mô tả hình ảnh ở đây


1
PS - Đặt các gói trong tệp BundleConfig.cs trong thư mục App_Start.
Amit

Nơi bạn cập nhật phần có nội dung <Required> <DataType (DataType.Date)> Thuộc tính công cộng DOB As DateTime? = Không có gì
Alan

Đây dường như là VB.NET, dành cho những người xé tóc ra. Đã cố gắng chuyển đổi nó sang c # nhưng bất kể tôi đã thử nó vẫn không thành công.
SteveCav

Đây có vẻ là một ý tưởng hay, nhưng có quá nhiều chi tiết để tái tạo giải pháp của bạn. Ví dụ: tôi không có thư mục Tập lệnh, cũng không có thư mục Gói, mà mã của bạn dường như mong đợi chứa đầy các tập lệnh nhất định?
Alan Baljeu

7

Cố gắng cung cấp một bản cập nhật ngắn gọn, dựa trên câu trả lời của Enzero .

  • Cài đặt gói Bootstrap.Datepicker .

    PM> install-package Bootstrap.Datepicker
    ...
    Successfully installed 'Bootstrap.Datepicker 1.7.1' to ...
    
  • Trong AppStart / BundleConfig.cs , thêm các tập lệnh và kiểu liên quan trong các gói.

    bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
          //...,
          "~/Scripts/bootstrap-datepicker.js",
          "~/Scripts/locales/bootstrap-datepicker.YOUR-LOCALE-CODE-HERE.min.js"));
    
    bundles.Add(new StyleBundle("~/Content/css").Include(
          ...,
          "~/Content/bootstrap-datepicker3.css"));
    
  • Trong giao diện liên quan, trong phần tập lệnh, hãy bật và tùy chỉnh trình chọn ngày.

    @section scripts{
        <script type="text/javascript">
            //...
            $('.datepicker').datepicker({
                format: 'dd/mm/yyyy', //choose the date format you prefer
                language: "YOUR-LOCALE-CODE-HERE",
                orientation: 'left bottom'
            });
        </script>
    
  • Cuối cùng thêm datepicker lớp trong việc kiểm soát liên quan. Ví dụ: trong TextBox và định dạng ngày tương tự như "31/12/2018", điều này sẽ là:

    @Html.TextBox("YOUR-STRING-FOR-THE-DATE", "{0:dd/MM/yyyy}", new { @class = "datepicker" })
    

Hi, làm thế nào để bạn thực hiện điều này một phạm vi ngày, tức là nhu cầu sử dụng để chọn hai ngày từ & đến
biến áp

Tôi muốn áp dụng điều này nhưng tôi không có BundleConfig.cs. Kiến trúc Razor Pages .net core 2 MVVM.
Alan Baljeu

4
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }

trang trí mô hình của bạn như thế này. có thể sử dụng công cụ chọn ngày giờ trong bootstrap mà tôi đã sử dụng công cụ này. https://github.com/Eonasdan/bootstrap-datetimepicker/

Tôi cho rằng bạn đã có các gói cho bootstrap css và js

Các mục nhập gói bộ chọn ngày của bạn

 bundles.Add(new ScriptBundle("~/bundles/datePicker").Include(
           "~/Scripts/moment.min.js",
           "~/Scripts/bootstrap-datetimepicker.min.js"));

        bundles.Add(new StyleBundle("~/Content/datepicker").Include(
                 "~/Content/bootstrap-datetimepicker.min.css"));

Hiển thị các gói trên Chế độ xem bố cục của bạn

@Styles.Render("~/Content/datepicker")
@Scripts.Render("~/bundles/datePicker")

HTML của bạn trong chế độ xem

<div class="form-group">
        @Html.LabelFor(model => model.BirthDate, htmlAttributes: new { @class = "lead col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.BirthDate, new { @class = "datetimepicker form-control" })
            @Html.ValidationMessageFor(model => model.BirthDate, "", new { @class = "text-danger" })
        </div>
</div>

Ở cuối chế độ xem của bạn, hãy thêm điều này.

<script>
    $(document).ready(function () {
        $('.datetimepicker').datetimepicker({
            format: 'lll'
        });
    });
</script>

1
Vui lòng lưu ý rằng loại đầu vào "ngày tháng" (do Datatype.Date đặt) hiện chỉ được Chrome, Safari và Opera hỗ trợ (như bạn có thể xem tại đây: w3schools.com/html/html_form_input_types.asp ).
Browseeliesel

1
@leiseliesel Tôi đã cập nhật câu trả lời bằng cách sử dụng bộ chọn ngày giờ trong bootstrap.
dnxit

3

1. đảm bảo rằng bạn đã tham khảo jquery.js lúc đầu 2.
kiểm tra bố cục, đảm bảo bạn gọi "~ / bó / bootstrap"
3. kiểm tra bố cục, xem phần kết xuất Vị trí tập lệnh, nó phải nằm sau "~ / bó / bootstrap"
4 .add lớp "datepicker" vào hộp văn bản
5.put $ ('. datepicker'). datepicker (); trong $ (function () {...});



-2

Đơn giản:

[DataType(DataType.Date)]
Public DateTime Ldate {get;set;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.