65

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

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

しかし、私は次のようなもので成功しているだけです:

mysite/Controller/Action/200909211020

この形式を処理するカスタム関数を作成します。

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

4

10 に答える 10

42

最初の例の 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。

于 2009-08-03T20:42:51.397 に答える
39

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);
}
于 2015-01-29T16:17:33.610 に答える
18

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

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);
于 2009-08-03T19:44:29.923 に答える
6

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

日付と時刻を必要に応じてエンコードします。

于 2016-01-26T20:57:42.487 に答える
5

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 パラメーターをアクション メソッド パラメーターにマップできます。

于 2009-08-03T20:42:16.110 に答える
1

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

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)

于 2012-12-10T23:14:24.617 に答える
1

MVC 5 以降、型をサポートする組み込みの属性ルーティングパッケージを使用できますdatetime。これは、DateTime に解析できるものすべてを受け入れます。

例えば

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

詳細はこちら

于 2014-02-04T10:06:04.957 に答える
0

まず、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 表現を持つことができます。

于 2009-08-03T19:40:15.343 に答える