এএসপি.নেট এমভিসি 3 তে একটি নির্দিষ্ট বিন্যাসে ডেটটাইম কীভাবে রেন্ডার করবেন?


117

আমার মডেল ক্লাসে যদি টাইপের একটি সম্পত্তি থাকে তবে DateTimeআমি কীভাবে এটি একটি নির্দিষ্ট বিন্যাসে রেন্ডার করতে পারি - উদাহরণস্বরূপ যে ফর্ম্যাটটিতে ToLongDateString()ফিরে আসে?

আমি এটি চেষ্টা করেছি ...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

... যা একটি ব্যতিক্রম ছোঁড়ে কারণ অভিব্যক্তিটি অবশ্যই কোনও সম্পত্তি বা ক্ষেত্রের দিকে নির্দেশ করবে। এবং এই...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

... যা কোনও ব্যতিক্রম ছুঁড়ে না, তবে রেন্ডার আউটপুট খালি থাকে (যদিও valআমি ডিবাগারে দেখতে পেতাম প্রত্যাশিত মান রয়েছে)।

অগ্রিম টিপস জন্য ধন্যবাদ!

সম্পাদন করা

ToLongDateStringশুধুমাত্র একটি উদাহরণ। আমি পরিবর্তে যা ব্যবহার করতে চাই তা ToLongDateStringহ'ল একটি কাস্টম এক্সটেনশন পদ্ধতি DateTimeএবং DateTime?:

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

সুতরাং, আমি মনে করি আমি ভিউমোডেল বৈশিষ্ট্যে বিশিষ্টতা DisplayFormatএবং DataFormatStringপ্যারামিটার ব্যবহার করতে পারি না ।

উত্তর:


159

আপনি যা করতে চান তা যদি নির্দিষ্ট ফরমেটের সাথে তারিখটি প্রদর্শন করা হয় তবে কেবল কল করুন:

@String.Format(myFormat, Model.MyDateTime)

@Html.DisplayFor(...)আপনি কোনও টেম্পলেট নির্দিষ্ট না করে ব্যবহার করা বা অতিরিক্ত পুনরুক্তির মতো টেমপ্লেটগুলিতে নির্মিত এমন কোনও কিছু ব্যবহারের প্রয়োজন না হলে ব্যবহার করা কেবল অতিরিক্ত কাজ IEnumerable<T>। একটি টেম্পলেট তৈরি করা যথেষ্ট সহজ, এবং খুব নমনীয়তাও সরবরাহ করতে পারে। কল করা বর্তমান নিয়ামক (বা ভাগ করা ভিউ ফোল্ডার) এর জন্য আপনার ভিউ ফোল্ডারে একটি ফোল্ডার তৈরি করুন DisplayTemplates। সেই ফোল্ডারের অভ্যন্তরে, আপনি যে মডেলটির জন্য টেমপ্লেট তৈরি করতে চান তার সাথে আংশিক দৃশ্য যুক্ত করুন। এক্ষেত্রে আমি /Views/Shared/DisplayTemplatesআংশিক ভিউ যুক্ত করেছি এবং যুক্ত করেছি ShortDateTime.cshtml

@model System.DateTime

@Model.ToShortDateString()

এবং এখন আপনি নিম্নলিখিত লাইনের সাহায্যে সেই টেম্পলেটটি কল করতে পারেন:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

ধন্যবাদ, এটি দেখতে ভাল লাগছে এবং এই টেমপ্লেট প্যারামিটারটি ("শর্টডেটটাইম") এটাদেদিনী উত্তরে আমার মন্তব্যে যে সমস্যাটি বর্ণনা করেছি তাও সমাধান করে।
স্লুমা

3
টাইপটি যদি "ডেটটাইম?" "ডেটটাইম" (@ মডেল ডেটটাইম?) এর পরিবর্তে ... সিপ্লে টেম্পলেটটি হ'ব ননযোগ্য বা তারিখের সময়গুলি নয় handle ফাইলটির নাম "তারিখটাইম.কোশটিএমএল" থাকা উচিত।
রোমিয়াস

+1 এ সম্পর্কে মন্তব্য করতে হবে, আমার অ্যাপ্লিকেশন দুর্দান্ত কাজ! ধন্যবাদ!
রাসেল ক্রিস্টেনসেন

@ এইচটিএমএল.ডিসপ্লেফোর্ড ব্যবহার করুন () অতিরিক্ত কাজ নয়, এটি মডেলটির এইচটিএমএল প্রতিনিধিত্ব উপস্থাপন করে, এমনকি টেমপ্লেটগুলি ছাড়াই .... বিভ্রান্ত হবেন না ...
ক্যাবুকসা.ম্যাপেচ

stackoverflow.com/questions/19920603/... কোডটি nullable datetimes @Romias উল্লেখ সঙ্গে তার আচরণ সহায়ক ধারণ করে।
ওয়াল্টার ডি জং

171

আপনি [DisplayFormat]গুণাবলী সহ আপনার দর্শন মডেল সম্পত্তি সাজাতে পারে:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

এবং আপনার দৃষ্টিতে:

@Html.EditorFor(x => x.MyDate)

অথবা, মানটি প্রদর্শনের জন্য,

@Html.DisplayFor(x => x.MyDate)

আরেকটি সম্ভাবনা, যা আমি সুপারিশ করি না তা হ'ল দুর্বলভাবে টাইপ করা সহায়ক ব্যবহার করা:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@ ডারিন: আমি একটি ইনপুট উপাদান চাই না, তবে কেবল স্থির পাঠ্য আউটপুট চাই। আমার এও উল্লেখ করা উচিত যে প্রকৃত বিন্যাসটি কাস্টম এক্সটেনশন পদ্ধতি দ্বারা তৈরি হয়েছিল DateTime(টোলংডেটস্ট্রিং কেবল উদাহরণ ছিল), সুতরাং এটি ব্যবহার করার সম্ভাবনা কম DataFormatString
স্লোমা

2
@ স্লুমা, কেমন আছে @Html.DisplayFor(x => x.MyDateTime)। @ নিকলারসেন এ কারণেই দর্শন মডেলগুলি ব্যবহার করা উচিত। আমার উদাহরণে আমি এই বৈশিষ্ট্যটি দিয়ে ভিউ মডেলটি সাজাচ্ছি এবং একটি ভিউ ইতিমধ্যে একটি প্রদত্ত দৃশ্যের সাথে আবদ্ধ, এটি তার উদ্দেশ্য।
দারিন দিমিত্রভ

1
@ স্লুমা, ঠিক আছে, এক্ষেত্রে আপনি হয় একটি কাস্টম ডিসপ্লে টেম্পলেট ব্যবহার করতে পারেন বা আপনার ভিউ মডেলটি একটি স্ট্রিং প্রপার্টি ব্যবহার করতে পারেন এবং আপনি যখন মডেল এবং ভিউ মডেলের মধ্যে মানচিত্র করবেন তখন ম্যাপিং স্তরে রূপান্তরটি সম্পন্ন হবে (আপনি এইভাবে পারতেন তবুও কেবলমাত্র ভিউতে এইচটিএমএল.ডিসপ্লেফোর্ড ব্যবহার করুন)।
দারিন দিমিত্রভ

5
@ নিকলারসেন, না, এটি প্রতি ভিউয়ের জন্য একটি মডেল। লোকেরা এই ভুলটি করার কারণে এমন প্রশ্নগুলি হয় যে আমি কীভাবে একটি নিয়ন্ত্রণকারী ক্রিয়ায় কিছু সম্পত্তিকে বৈধতা থেকে বাদ দিয়ে অন্যটিতে নয়? তাই খুব সাধারণ।
দারিন দিমিত্রভ

1
এক বছর পরে এই প্রশ্নে ফিরে আসছি, আমি প্রতিটি দর্শন অনুযায়ী এক মডেলের যুক্তির সাথে একমত হই। আমি এখনও মনে করি যে ডিসপ্লে পছন্দগুলির সাথে ডিল করা কোনও কিছুই ভিউয়ের সাথে সম্পর্কিত এবং মডেলটি নয়।
নিক লারসন

26

মডেলের অভ্যন্তরে সরল বিন্যাসিত আউটপুট

@String.Format("{0:d}", model.CreatedOn)

বা পূর্বাঞ্চ লুপ মধ্যে

@String.Format("{0:d}", item.CreatedOn)

ব্যবহারের স্বীকৃত উত্তরের সদৃশ বলে মনে হচ্ছেstring.Format
পল টাইং

2
@ পোলটাইং এই উত্তরটি আমার কাছে স্বীকৃত উত্তরের চেয়ে পরিষ্কার ছিল, ওডসুক আসলে প্রথম প্যারামে ফর্ম্যাটটি দেখিয়েছিল যা একজন নতুন হিসাবে আমাকে সাহায্য করেছিল।
ড্যান

1
আমি সম্মত, এই উত্তরটি আমাকে সাহায্য করেছিল।
গ্লেন গারসন

26

আমি ইনলাইন ফর্ম্যাট এবং মডেল থেকে তারিখের সম্পত্তি প্রদর্শন করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করি।

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

অন্যথায় কোনও পাঠ্যবক্স বা সম্পাদক পপুলেট করার সময় আপনি @ ডারিনের পরামর্শ মতো, অ্যাট্রিবিউটকে অ্যাট্রিবিউট দিয়ে সজ্জিত করতে পারেন [DisplayFormat]


এই যে সমাধানটি আমি সন্ধান করছি!
এনভিল

এই যে সমাধানটি আমি খুঁজছিলাম!
রায়হান রিদয়

9

যদি আপনার সমস্ত DateTimeপ্রকার একইভাবে উপস্থাপিত হয় তবে আপনি একটি কাস্টম DateTimeপ্রদর্শন টেম্পলেট ব্যবহার করতে পারেন ।

আপনার দৃশ্যের ফোল্ডারে আপনার নিয়ামক নির্দিষ্ট দৃশ্যের ফোল্ডারের নীচে বা "ভাগ করা" ফোল্ডারের (এই অংশগুলির অনুরূপ কাজ করে) নীচে "ডিসপ্লেটেম্পলেটগুলি" নামে একটি ফোল্ডার তৈরি করুন।

ভিতরে একটি ফাইল তৈরি করুন DateTime.cshtmlযা আপনার তারিখটি কীভাবে রেন্ডার করতে চায় তার কোড এবং কোড DateTimeহিসাবে নেয় as@model

@model System.DateTime
@Model.ToLongDateString()

এখন আপনি এটি আপনার দর্শনগুলিতে ব্যবহার করতে পারেন এবং এটির কাজ করা উচিত:

@Html.DisplayFor(mod => mod.MyDateTime)

যতক্ষণ আপনি এটি "ডিসপ্লেটেম্প্লেটস" ফোল্ডারে যুক্ত করার এবং ফাইলটি নাম প্রদর্শন করার ধরণের সাথে মিল রেখে নামকরণের কনভেনশন অনুসরণ করেন, এমভিসি আপনার মানগুলি প্রদর্শনের জন্য এটি স্বয়ংক্রিয়ভাবে ব্যবহার করবে। এটি "EditorTemplates" ব্যবহার করে দৃশ্য সম্পাদনা করার জন্যও কাজ করে।

এখানে টেমপ্লেট সম্পর্কিত আরও কিছু তথ্য


ধন্যবাদ, আমি কেবল এটি পরীক্ষা করেছি এবং টাইপটি সত্যিই যদি হয় তবে তা ঠিক কাজ করে DateTime। যাইহোক আমার কাছে কয়েকটি বাতিল ডেটটাইম বৈশিষ্ট্য রয়েছে। আমি DisplayTemplatesফোল্ডারে কল করা NullableDateTime.cshtmlএবং এর মধ্যে একটি দ্বিতীয় ফাইল তৈরি করার চেষ্টা করেছি : @using MyHelpers @model System.DateTime? @Model.MyCustomExtension()এখানে MyCustomExtensionএকটি এক্সটেনশন পদ্ধতি রয়েছে DateTime?। তবে এটি একটি ব্যতিক্রম পেতে যখন একটি ডেটটাইম? ক্ষেত্রটি আমাকে সত্যিই নাল করে দিচ্ছে যে অভিধানটিতে এমন একটি মডেলের উপাদান প্রয়োজন DateTimeযা শূন্য নয়। একটি অযোগ্য ডেটটাইমের জন্য একটি ডিসপ্লেপেম্প্লেট সংজ্ঞায়নের কোনও উপায় আছে কি?
স্লুমা

@ স্লোমা: হুম, ভাল প্রশ্ন। NullableDateTime.cshtml@ সম্ভবত লিকারসেন পরামর্শ ও ব্যবহার করেছেন এমন পদ্ধতির সাথে আমি লেগে থাকতে চাই @Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
এটাদেদিনী

আপনার ডেটটাইম সি.এস.টি.এম. টেমপ্লেটটি "@ মডেল ডেটটাইম" হিসাবে সেট করা থাকলে আপনার স্পষ্টতই টেম্পলেটটির নাম যুক্ত করার দরকার নেই? পরিবর্তে "ডেটটাইম"। এইভাবে সমস্ত তারিখগুলি (অযোগ্য বা না) একই টেমপ্লেট দ্বারা পরিচালিত হয় ...
রোমিয়াস

7

আমার পছন্দটি হ'ল ফর্ম্যাটের বিবরণটি ভিউ মডেলের সাথে নয়। এমভিসি 4 / রেজারে:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

তারিখের সময়ের ফর্ম্যাট রেফারেন্স: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

তারপরে আমার কাছে একটি জিকুয়ের ডেটপিকার রয়েছে এবং এটি তারিখটিকে আলাদা ফর্ম্যাট হিসাবে রাখবে ... দোহ!

দেখে মনে হচ্ছে আমাকে একই ফর্ম্যাটেটিংয়ের জন্য ডেটপিকারের ফর্ম্যাটটি সেট করা দরকার।

সুতরাং আমি System.Globalizationএকটি ডেটা- * বৈশিষ্ট্যে ফরম্যাটিংটি সঞ্চয় করছি এবং সেটআপ করার সময় এটি সংগ্রহ করছি

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

এবং এখানে স্তন্যপায়ী অংশটি রয়েছে:। নেট এবং ডেটপিকারের ফর্ম্যাটগুলি মেলে না, তাই হ্যাকারি প্রয়োজন:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

এটি এক ধরণের দুর্বল, তবে প্রচুর মামলা coverেকে রাখা উচিত।


প্রথম 3 লাইন সবচেয়ে গুরুত্বপূর্ণ :) ফর্ম্যাট সংজ্ঞায়নের উদাহরণ এবং লিঙ্ক
বোরিক

2

আমার জন্য কাজ কর

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

এই প্রশ্নটি স্পষ্টতই রেজার ভিউ ইঞ্জিন ব্যবহার করছে, আপনি একটি আলাদা ভাষা ব্যবহার করে জবাব দিয়েছেন।
রাইস বেভিলাকোয়া

2

সম্প্রতি একই সমস্যা ছিল।

আমি যে কেবল সংজ্ঞা আবিষ্কৃত ডাটাটাইপ হিসাবে তারিখ মডেল হিসেবে ভাল কাজ করে (ব্যবহার কোড প্রথম পদ্ধতির)

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


0

আমি যদি কেবল সংক্ষিপ্ত ফর্ম্যাটে তারিখটি প্রদর্শন করতে চাই তবে আমি কেবল @ Model.date.ToShortDateString () ব্যবহার করি এবং এটি তারিখটি এতে মুদ্রণ করে


0

আপনি যা করতে চান তা যদি নির্দিষ্ট ফরমেটের সাথে তারিখটি প্রদর্শন করা হয় তবে কেবল কল করুন:

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

এটি নিম্নলিখিত ফর্ম্যাট এর ফলে হবে,

26-Apr-2013

04/26/13

@ মডেল.লিডডেট == বাতিল হলে কী হবে?
বিমল দাশ

0

এটি dd/MM/yyyyআপনার দর্শনে বিন্যাসে প্রদর্শিত হবে

দেখুন:

পরিবর্তে DisplayForএই কোড ব্যবহার করুন

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

এটি তারিখ কলামে মানটি শূন্য হয় কিনা তাও পরীক্ষা করে, সত্য হয় তবে এটি তারিখটি খালি বা কলাম থেকে আসল বিন্যাসের তারিখ প্রদর্শন করবে।

আশা কাউকে সাহায্য করে।



0

এমভিসি 5 তে আমি ব্যবহার করব, যদি আপনার মডেলটি তারিখের সময় হয়

string dt = Model.ToString("dd/MM/yyy"); 

অথবা যদি আপনার মডেলটিতে তারিখের সম্পত্তি থাকে

string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

ফর্ম্যাটগুলির সরকারী অর্থ এখানে:

https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx


-2

কেবল ফাইল এডজাস্ট করুন। আপনি এটি চেষ্টা করতে পারেন।

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdateএটি আপনার DateTimeটাইপ ডেটা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.