Jak dodać Date Picker Bootstrap 3 w projekcie MVC 5 przy użyciu silnika Razor?


81

Potrzebuję wskazówek, jak zainstalować Date Picker Bootstrap 3 w projekcie MVC 5 przy użyciu silnika Razor. Znalazłem ten link tutaj, ale nie mogłem go uruchomić w VS2013.

Kopiując z przykładu w późniejszym linku powyżej, wykonałem już następujące czynności:

            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"));

Następnie dodałem skrypt do widoku indeksu w następujący sposób

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

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

Jak teraz zadzwonić do selektora dat?

   <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>

Pokaż nam swój kod cshtml / Razor, z którym pracujesz, który nie działa. Dzięki
— Eric Bishard

Dziękuję za odpowiedź. Odpowiednio zaktualizowałem swój post
— Ben Junior

Uruchomię VS i zobaczę, czy uda mi się to rozgryźć!
— Eric Bishard

Czy użyłeś NuGet do dodania plików, czy dodałeś je ręcznie?
— Mehdiway

waqar ahmed to zdecydowanie najprostsze rozwiązanie.
— Dieglock

Odpowiedzi:


79

Ta odpowiedź wykorzystuje jQuery UI Datepicker , który jest osobnym włączaniem. Są na to inne sposoby bez dołączania interfejsu użytkownika jQuery.

Najpierw musisz po prostu dodać datepickerklasę do pola tekstowego, a także 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>

Następnie, aby upewnić się, że javascript jest uruchamiany po wyrenderowaniu pola tekstowego, musisz umieścić wywołanie datepicker w funkcji gotowej do jQuery:

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

4
Tak, właśnie tak mam teraz swój kod i nie działa
— Eric Bishard

1
Dlatego używam Fundacji! Mam to samo co ty, próbowałem '@class = "form-control datepicker"' & '@class = "datepicker form-control"' i żadnych kości
— Eric Bishard

3
Jeśli przez przypadek wywołujesz go w widoku częściowym, skrypt musi znajdować się na stronie indeksu lub nie zadziała, jeśli jest to widok częściowy. Był to również jeden z naprawionych problemów
— Ben Junior

Czy mogę zautomatyzować Razor, aby jeśli [DataType(DataType.Date)]zdefiniowano pole, powinien automatycznie dodać datepickerklasę css i uruchomić js?
— Shimmy Weitzhandler

1
Szablony MVC 5, które mam w Visual Studio 2015, nie zawierają interfejsu użytkownika JQuery, więc jestem prawie pewien, że musisz najpierw zainstalować i odwołać się do tego, zanim to zadziała. Jest tutaj porządna dyskusja z linkami do powiązanych samouczków: forums.asp.net/t/ ...
— Paul Angelno

61

Ta odpowiedź po prostu stosuje type=dateatrybut do inputelementu HTML i polega na tym, że przeglądarka dostarcza selektor dat. Zwróć uwagę, że nawet w 2017 roku nie wszystkie przeglądarki udostępniają swój własny selektor dat, więc możesz chcieć wprowadzić rezerwę.

Wszystko, co musisz zrobić, to dodać atrybuty do właściwości w modelu widoku. Przykład zmiennej Ldate:

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

Zakładając, że używasz MVC 5 i Visual Studio 2013.


3
To NAJLEPSZA odpowiedź! Czy istnieje sposób, aby wybrać godzinę i datę? [DataType(DataType.DateTime)] public DateTime BirthDate { get; set; }nie działa dla mnie.
— Yoda,

2
Najprostsze rozwiązanie jest tutaj
— Hoang Trinh

26
To NIE jest poprawna odpowiedź! To rozwiązanie spowoduje, że kalendarze specyficzne dla przeglądarki będą wyświetlane w przeglądarce tylko dla pól daty. Nie ma to nic wspólnego z wtyczką Bootstrap Datetime.
— ilter

3
To nie będzie działać z IE 11 i FF 38. Tylko Chrome to odbierze.
— immirza

1
Innym problemem związanym z tym rozwiązaniem jest to, że podczas edycji pola daty widzę po prostu „mm / dd / rrrr” zamiast wartości daty, która już istnieje.
— Paul Angelno

19

Dodaj tylko te dwa wiersze przed właściwością datetime w modelu

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

a wynikiem będzie:Selektor dat w aplikacji MVC


Ale czy użyjesz w widoku? Próbowałem TextBoxFor, ale nadal jest to pole tekstowe
— Harambe Attack Helicopter

Ta metoda działa tylko w niektórych przeglądarkach, takich jak Chrome.
— Kazem

IE zawiedzie twoje rozwiązanie!
— immirza

Gdyby ktoś miał ten błąd: Nie można odczytać właściwości „msie” z undefined. To naprawiło
— ruben450

19

Mam nadzieję, że pomoże to komuś, kto miał ten sam problem.

Ta odpowiedź wykorzystuje wtyczkę Bootstrap DatePicker , która nie jest natywna dla ładowania początkowego.

Upewnij się, że instalujesz Bootstrap DatePicker za pośrednictwem NuGet

Utwórz mały kawałek JavaScript i nazwij go DatePickerReady.js zapisz go w katalogu Scripts dir. Dzięki temu będzie działać nawet w przeglądarkach innych niż HTML5, chociaż obecnie jest ich niewiele.

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

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

    });
}

Ustaw pakiety

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"))

Teraz ustaw typ danych, aby w przypadku użycia EditorFor MVC zidentyfikował, co ma być używane.

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

Twój kod widoku powinien być

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

i voila

wprowadź opis obrazu tutaj


1
PS - Ustaw paczki w pliku BundleConfig.cs w folderze App_Start.
— Amit

Gdzie aktualizujesz część, która czyta <Required> <DataType (DataType.Date)> Właściwość publiczna DOB As DateTime? = Nic
— Alan

Wygląda na to, że to VB.NET dla tych, którzy wyrywają sobie włosy. Próbowałem przekonwertować go na c #, ale bez względu na to, co próbowałem, nic nie zrobił.
— SteveCav

Wydaje się, że to dobry pomysł, ale zbyt wiele szczegółów, aby odtworzyć rozwiązanie. Na przykład nie mam folderu Scripts ani folderu Bundles, w którym Twój kod najwyraźniej oczekuje, że zostanie wypełniony określonymi skryptami?
— Alan Baljeu

7

Próba dostarczenia zwięzłej aktualizacji w oparciu o odpowiedź Enzero .

  • Zainstaluj pakiet Bootstrap.Datepicker .

    PM> install-package Bootstrap.Datepicker
    ...
    Successfully installed 'Bootstrap.Datepicker 1.7.1' to ...
    
  • W AppStart / BundleConfig.cs dodaj powiązane skrypty i style w pakietach.

    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"));
    
  • W odpowiednim widoku, w sekcji skryptów, włącz i dostosuj datepicker.

    @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>
    
  • Ostatecznie dodaj klasę Datepicker w pokrewnej kontrolce. Na przykład w TextBox i dla formatu daty podobnego do „31/12/2018” będzie to:

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

Cześć, jak ustawić ten zakres dat, tj. Użytkownik musi wybrać dwie daty od i do
— transformer

Chciałbym to zastosować, ale nie mam pliku BundleConfig.cs. Architektura Razor Pages .net core 2 MVVM.
— Alan Baljeu

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

udekoruj swój model w ten sposób. mogę użyć selektora daty i czasu ładowania początkowego. Użyłem tego. https://github.com/Eonasdan/bootstrap-datetimepicker/

Przypuszczam, że masz już pakiety dla bootstrap css i js

Twoje wpisy w paczce selektora dat

 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"));

Renderuj pakiety w widoku układu

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

Twój HTML na widoku

<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>

Na końcu swojego widoku dodaj to.

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

1
Proszę wziąć pod uwagę, że typ wejściowy „date” (ustawiony przez Datatype.Date) jest obecnie obsługiwany tylko przez Chrome, Safari i Opera (jak widać tutaj: w3schools.com/html/html_form_input_types.asp ).
— leiseliesel

1
@leiseliesel Zaktualizowałem odpowiedź za pomocą selektora daty i czasu ładowania początkowego.
— dnxit

3

1. upewnij się, że na początku odnosisz się do jquery.js 2. sprawdź
układ, upewnij się, że wywołujesz "~ / bundles / bootstrap"
3. sprawdź układ, zobacz sekcję renderowania Pozycja skryptów, musi znajdować się po "~ / bundles / bootstrap"
4 .dodaj klasę "datepicker" do
pola tekstowego 5.put $ ('. datepicker'). datepicker (); w $ (funkcja () {...});


-1

Selektor dat w interfejsie Checkout Shield dla MVC . Potężny komponent, który możesz zintegrować za pomocą kilku linii, takich jak:

@(Html.ShieldDatePicker()
    .Name("datepicker"))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.