2017-04-04 100 views
0

路由如果我有這樣一個ActionResult方法,以便:屬性與約束

public ActionResult AllSummaries(int? page, DateTime? yesterday) 

相反的路線是這樣的:

http://serverName/projectName/controllerName/AllSummaries?yesterday=04/03/2017 

我想它是:

http://serverName/projectName/controllerName/AllSummaries/04/03/2017 

因此,在ActionResult的頂部,我如何添加一個約束,使日期時間只顯示格式爲MM/dd/yyyy

[Route("allsummaries/yesterday/{yesterday:}")] 
public ActionResult AllSummaries(int? page, DateTime? yesterday) 

我不需要驗證日期和日期是否爲1位或2位..它將始終爲2位數。

任何幫助表示讚賞。

UPDATE

現在得到404錯誤:

這裏是我使用的鏈接:

http://serverName/projectName/controllerName/allsummaries/yesterday/3/4/2017 

這裏是我的動作:

[Route("controllerName/allsummaries/yesterday/{month?}/{day?}/{year?}")] 
[ValidateInput(false)] 
public ActionResult AllSummaries(int? page, int? day, int? month, int? year) 
{ 

    if (day.HasValue && month.HasValue && year.HasValue) 
    { 
     var yesterday = new DateTime(year.Value, month.Value, day.Value); 
    } 

路線我生成的是從控制檯a pplication即是要通過Windows服務會自動發送郵件,所以我不能使用@Url.Action ...等等。我硬編碼,像這樣的鏈接:

mail.Body = mail.Body + "<div>" + "<p>" + 
"http://serverName/projectName/controllerName/allsummaries/yesterday/" + 
DateTime.Today.AddDays(-1).Day + 
"/" + DateTime.Today.AddDays(-1).Month + "/" + 
DateTime.Today.AddDays(-1).Year + "</p>" + "</div>"; 

回答

1

的問題是日期,這將被解釋爲路徑分隔符的斜線。路由框架只解析路徑分隔符之間的參數,除非您使用貪婪參數語法,即{*yesterday}。但是,如果你這樣做,URL路徑的任何其他部分將被消耗。例如,如果用戶將URL更改爲allsummaries/yesterday/04/03/2017/foo之類的內容,那麼04/03/2017/foo將作爲yesterday傳入,並且您的操作爆炸。

您有兩種選擇。

  1. 您可以使用不同的日期格式,如ISO:yyyy-MM-dd,這將使你的URL /allsummaries/yesteday/2017-04-03,你可以捕捉一個PARAM日期部分:{yesterday}

    [Route("allsummaries/yesterday/{yesterday}")] 
    
  2. 您可將日期組件,然後將它們重新組合成一個DateTime在行動:

    [Route("allsummaries/yesterday/{month?}/{day?}/{year?}")] 
    

    然後,在你的行動:

    public ActionResult AllSummaries(int? page, int? month, int? day, int? year) 
    { 
        var yesterday = DateTime.Today.AddDays(-1); // default 
        if (month.HasValue && day.HasValue && year.HasValue) 
        { 
         yesterday = new DateTime(year.Value, month.Value, day.Value); 
        } 
    

編輯

我不想混淆主要問題,但如果您選擇按照第二個選項,將日期分解爲組件,則需要注意一個問題。如果您有明確的URL,如/allsummaries/yesterday/04/03/2017,則模型綁定器將能夠將「04」和「03」解析爲int s。但是,如果您嘗試使用類似Url.Action,Url.RouteUrl等的方式嘗試創建的網址,則需要提供像「04」這樣的參數值,而不是int,否則您將最終得到像/allsummaries/yesterday/4/3/2017這樣的URL 。你可以做的是通過這樣的:

@Url.Action("AllSummaries", new 
{ 
    month = date.ToString("MM"), 
    day = date.ToString("dd"), 
    year = date.Year 
}) 

換句話說,你需要使用ToString獲得兩位數的值,而不是直接date.Monthdate.Day

你應該也可能通過增加正則表達式contraint這些PARAMS保護的網址被篡改了一點:

[Route("allsummaries/yesterday/{month?:regex([0-9]{2})}/{day?:regex([0-9]{2})}/{year?:regex([0-9]{4}}")] 
+0

請參閱我的更新 –

+0

還有一些其他問題。 –

+0

好吧,對不起,我再次更新..解釋是在更新中,但我仍然可以做字符串格式化 –

0

您可以分析日,月,年獨, 然後創建日期。

您的代碼將是這樣的:

[Route("allsummaries/yesterday/{day}/{month}/{year}")] 
public ActionResult AllSummaries(int? page, int day, int month, int year) 
{ 
    var yesterday = new Date(day, month, year); 
} 

[Route("allsummaries/yesterday")] 
public ActionResult AllSumaries(int? page) 
{ 
} 
+0

天,月,年需要可空 –

+0

添加另一個端點屬性'allsummaries /昨天' – Ygalbel

+0

你能編輯你的代碼嗎? –