web-dev-qa-db-ja.com

asp.net mvcのURIパラメータとして日時値を渡すにはどうすればよいですか?

日時値を持つアクションパラメータが必要ですか?これを行う標準的な方法はありますか?次のようなものが必要です。

mysite/Controller/Action/21-9-2009 10:20

しかし、私は次のようなことでそれを行うことに成功しています:

mysite/Controller/Action/200909211020

この形式に対応するカスタム関数を作成します。

繰り返しますが、これを行うための標準または認可されたASP.net MVCの方法を探しています。

57
GilShalit

最初の例の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を手動で。コロンを「!」に置き換えたとします。アクションリンク: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。

36
Kurt Schindler

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);
}
29
rnofenko

Ticks値を使用します。 DateTime構造に再構築するのは非常に簡単です

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);
13
Gordon Thompson

ASP .NET MVCのURIの一般的な形式は、Idが整数であるController/Action/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パラメーターをアクションメソッドパラメーターにマップできます。

5
Roland Schaer

同様の答えを探している人のために、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

日付と時刻をエンコードする必要があります。

5
Sam Ellis

年、月、日、時、分を分割する

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)

1
JonAlb

MVC 5以降では、datetimeタイプをサポートする組み込みの Attribute Routing パッケージを使用できます。これは、DateTimeに解析できるものをすべて受け入れます。

例えば.

[GET("Orders/{orderDate:datetime}")]

詳細 こちら

1
demoncodemonkey

まず、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表現を使用できます。

0
Freddy

私はそのように後ろにスラッシュを追加した後に動作することを理解しています

mysite/Controller/Action/21-9-2009 10:20/
0
Angie Loo