Пользовательский контроллер для MS MVC Newbie - PullRequest
1 голос
/ 12 сентября 2009

Пытаюсь начать реализацию MSC от MS, и я уже в затруднении ...

У меня есть такой маршрут:

  routes.MapRoute( "Custom", // Route name
           "RightHere/{entryDate}", // URL with parameters
           new { controller = "RightHere", action = "GetDate" } // Parameter defaults

           ); 

И соответствующее действие контроллера (RightHereController) выглядит так:

 public ActionResult GetDate(DateTime date)
    {


             try
             {
                 ViewData["Date"] = date;
                 return View();
             }
             catch
             {
                 return View();
             }
    }

Вид:

<h2>RightHere</h2>
<p><%= Html.Encode(ViewData["Date"]) %></p>

Достаточно просто .. Но получите оранжевый экран смерти при использовании URL / RightHere / GetDate / 1-1-2009

The parameters dictionary contains a null entry for parameter 'date' of non-nullable type 'System.DateTime' for method 'System.Web.Mvc.ActionResult GetDate(System.DateTime)'

Нужны ли вам более штатные, миссис MVC, скажите, что мне не хватает :)

Ответы [ 3 ]

2 голосов
/ 12 сентября 2009

У вас на самом деле две проблемы. Первая проблема заключается в том, что упомянутый выше URL не соответствует созданному вами маршруту. Вторая проблема связана с вашим маршрутом, и ваши действия не совсем совпадают.

У вас есть это для URL в вашем вопросе:

/ RightHere / GetDate / 1-1-2009

Это должно быть так:

/ RightHere / 1-1-2009

Если вы хотите, чтобы он был последним, вам нужно изменить маршрут на следующий:

routes.MapRoute(
    "Custom", 
    "RightHere/GetDate/{entryDate}", 
    new { controller = "RightHere", action= "GetDate" }
);

У вас есть это для вашего действия:

public ActionResult GetDate(DateTime date)
{
    ...
}

Это должно быть так, чтобы соответствовать вашему маршруту:

public ActionResult GetDate(DateTime entryDate)
{
    ...
}

Кроме этого, вы готовы идти. Просто убедитесь, что у вас есть маршрут вверху, над маршрутом по умолчанию. Я могу порекомендовать еще одну вещь, которая может помочь, добавив ограничение к вашему маршруту, например:

routes.MapRoute(
    "Custom", 
    "RightHere/{entryDate}", 
    new { controller = "RightHere", action= "GetDate" }, 
    new { entryDate = @"\d{2}-\d{2}-\d{4}"}
);

Это гарантирует, что переданная дата ввода имеет правильный формат.

0 голосов
/ 12 сентября 2009

Проблема в том, что вы определили дату и время как 'entryDate' в своем маршруте, но затем в своем действии вы определили его как 'date'.

Я не проверял привязку даты и времени на маршрутах, но попробуйте изменить действие на:

public ActionResult GetDate(DateTime entryDate)

Кроме того, URL-адрес, по которому вы его вызываете, не требует действия, поэтому используйте этот URL-адрес: / RightHere / 1-1-2009

Если это не сработает, я бы предложил использовать этот подход:

routes.MapRoute(
    "Custom", // Route name
    "RightHere/{year}/{month}/{day}", // URL with parameters
    new { controller = "RightHere", action = "GetDate" } // Parameter defaults
);

public ActionResult GetDate(int year, int month, int day)
{
    //do stuff
}

HTHS
Charles

0 голосов
/ 12 сентября 2009

Проблема связана с отображением вашего маршрута.

Вы пытаетесь получить доступ к URL / RightHere / GetDate / {entryDate}, но вы определили свой сопоставленный маршрут как / RightHere / {entryDate}. Вы можете добавить «/ GetDate» к своему маршруту или удалить его из URL-адреса, который вы тестируете.

Что выдает это сообщение об ошибке. Сначала я подумал, что существует проблема со словарем ViewData, который почему-то не имеет ключа Date. Однако сообщение об ошибке относится к действию контроллера и коллекции параметров. Это означает, что ошибка возникает до того, как представление будет возвращено / выполнено.

РЕДАКТИРОВАТЬ : отображение маршрута сложно. Пожалуйста, помните, что лучший маршрут не обязательно выигрывает день. Порядок, в котором вы добавляете отображение маршрута, является порядком, оцененным во время выполнения. Будет использован самый первый маршрут, который соответствует запрошенному URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...