asp.net mvcのURIパラメータとして日時値を渡すにはどうすればよいですか?
-
11-07-2019 - |
質問
日時値を持つアクションパラメーターが必要ですか?これを行う標準的な方法はありますか?次のようなものが必要です:
mysite/Controller/Action/21-9-2009 10:20
しかし、私は次のような方法で成功しているだけです:
mysite/Controller/Action/200909211020
この形式を処理するカスタム関数を作成します。
もう一度、これを行うための標準または認可されたASP.net MVCの方法を探しています。
解決
最初の例のURLのコロンはエラー(Bad Request)を引き起こすため、探しているものを正確に実行できません。それ以外は、DateTimeをアクションパラメーターとして使用することが最も確実に可能です。
デフォルトのルーティングを使用している場合、サンプルURLのこの3番目の部分は、DateTime値を{id}パラメーターとして取得します。したがって、アクションメソッドは次のようになります。
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を手動で。コロンを&quot;!&quot;に置き換えたとします。アクションリンク: new {id = DateTime.Now.ToString(&quot; dd-MM-yyyy HH!mm&quot;)}
。
アクションメソッドはこれを日付として解析できないため、この場合の最善策はおそらく文字列として受け入れることです。
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);
}
ティック値を使用します。 DateTime構造に再構築するのは非常に簡単です
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
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);
}
FYI、名前が同じである限り、任意のurlパラメーターをアクションメソッドパラメーターにマップできます。
同様の回答を探している人のために、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
日付と時刻をエンコードする必要があります。
MVC 5以降、組み込みの datetimeをサポートする属性ルーティング
パッケージを使用できます。 タイプ。DateTimeに解析できるものはすべて受け入れます。
e.g。
[GET("Orders/{orderDate:datetime}")]
詳細こちら。
まず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表現を使用できます。
年、月、日、分を分割
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についてはおbutび申し上げますが、アイデアはわかります:P)
iのように後ろにスラッシュを追加すると動作することに気付きました
mysite/Controller/Action/21-9-2009 10:20/