日時値を持つアクション パラメータが必要ですか? これを行う標準的な方法はありますか?次のようなものが必要です:
mysite/Controller/Action/21-9-2009 10:20
しかし、私は次のようなもので成功しているだけです:
mysite/Controller/Action/200909211020
この形式を処理するカスタム関数を作成します。
繰り返しますが、これを行うための標準または認可された ASP.net MVC の方法を探しています。
日時値を持つアクション パラメータが必要ですか? これを行う標準的な方法はありますか?次のようなものが必要です:
mysite/Controller/Action/21-9-2009 10:20
しかし、私は次のようなもので成功しているだけです:
mysite/Controller/Action/200909211020
この形式を処理するカスタム関数を作成します。
繰り返しますが、これを行うための標準または認可された ASP.net MVC の方法を探しています。
最初の例の URL のコロンはエラー (Bad Request) を引き起こすため、探していることを正確に行うことはできません。それ以外では、DateTime をアクション パラメーターとして使用することは間違いなく可能です。
デフォルトのルーティングを使用している場合、サンプル URL のこの 3 番目の部分は、{id} パラメータとして DateTime 値を取得します。したがって、Action メソッドは次のようになります。
public ActionResult Index(DateTime? id)
{
return View();
}
おそらく、私が持っているように Nullable Datetime を使用したいので、このパラメーターが含まれていなくても例外は発生しません。もちろん、「id」という名前を付けたくない場合は、別のルート エントリを追加して、{id} を任意の名前に置き換えます。
URL 内のテキストが有効な DateTime 値に解析される限り、必要な作業はこれだけです。次のようなものは問題なく動作し、アクション メソッドでエラーなしで取得されます。
<%=Html.ActionLink("link", "Index", new { id = DateTime.Now.ToString("dd-MM-yyyy") }) %>
もちろん、この場合の問題点は、時間を含めなかったことです。(有効な) 日付文字列をコロンで表されていない時刻でフォーマットする方法があるかどうかはわかりません。そのため、URL に時刻を含める必要がある場合は、独自の形式を使用して結果を解析する必要がある場合があります。 DateTime を手動で。コロンを「!」に置き換えたとします。アクションリンク: new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }
.
アクション メソッドはこれを日付として解析できないため、この場合の最善の策はおそらく文字列として受け入れることです。
public ActionResult Index(string id)
{
DateTime myDate;
if (!string.IsNullOrEmpty(id))
{
myDate = DateTime.Parse(id.Replace("!", ":"));
}
return View();
}
編集:コメントに記載されているように、間違いなく私のものよりも優れたソリューションが他にもいくつかあります。私が最初にこの回答を書いたとき、日時形式の本質を可能な限り維持しようとしていたと思いますが、これを処理するより適切な方法は明らかに URL エンコードです。Vlad のコメントに +1。
toISOString() を使用してみてください。ISO8601 形式の文字列を返します。
JavaScript から
$.get('/example/doGet?date=' + new Date().toISOString(), function (result) {
console.log(result);
});
C#から
[HttpGet]
public JsonResult DoGet(DateTime date)
{
return Json(date.ToString(), JsonRequestBehavior.AllowGet);
}
ticks 値を使用します。DateTime 構造に再構築するのは非常に簡単です。
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
同様の答えを探している人のために、MVC5で何がうまくいくかを共有したいと思いました。
私のコントローラーの署名は次のようになります。
public ActionResult Index(DateTime? EventDate, DateTime? EventTime)
{
}
Razor では、私の ActionLink は次のようになります。
@Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime})
これにより、次のような URL が得られます。
Book?EventDate=01%2F20%2F2016%2014%3A15%3A00&EventTime=01%2F20%2F2016%2014%3A15%3A00
日付と時刻を必要に応じてエンコードします。
ASP .NET MVC の URI の一般的な形式は Controller/Action/Id で、Id は整数です。
ルートの一部としてではなく、パラメーターとして日付値を送信することをお勧めします。
mysite/Controller/Action?date=21-9-2009 10:20
それでも問題が発生する場合は、日付に URI で許可されていない文字が含まれている可能性があり、エンコードする必要があります。チェックアウト:
encodeURIComponent(yourstring)
Javascript内のメソッドです。
サーバー側:
public ActionResult ActionName(string date)
{
DateTime mydate;
DateTime.Tryparse(date, out mydate);
}
参考までに、名前が同じである限り、任意の url パラメーターをアクション メソッド パラメーターにマップできます。
年、月、日、時、分を分割する
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}",
new { controller="YourControllerName", action="YourActionName"}
);
カスケード If ステートメントを使用して、アクションに渡されたパラメーターから日時を構築する
' Build up the date from the passed url or use the current date
Dim tCurrentDate As DateTime = Nothing
If Year.HasValue Then
If Month.HasValue Then
If Day.HasValue Then
tCurrentDate = New Date(Year, Month, Day)
Else
tCurrentDate = New Date(Year, Month, 1)
End If
Else
tCurrentDate = New Date(Year, 1, 1)
End If
Else
tCurrentDate = StartOfThisWeek(Date.Now)
End If
(vb.net には申し訳ありませんが、アイデアはわかります :P)
まず、global.asax に新しいルートを追加する必要があります。
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{date}",
new { controller="YourControllerName", action="YourActionName", date = "" }
);
コントローラーの場合:
public ActionResult MyActionName(DateTime date)
{
}
RegisterRoutes メソッドの下部にデフォルト ルートを保持することを忘れないでください。エンジンは、DateTime の例として {date} で送信した値をキャストしようとするため、キャストできない場合は例外がスローされることに注意してください。日付文字列にスペースまたは : が含まれている場合は、URL を正しく解析できるようにそれらを HTML.Encode することができます。いいえの場合は、別の DateTime 表現を持つことができます。