NerdDinner исключения и пользовательские ошибки - PullRequest
0 голосов
/ 16 февраля 2010

В этот учебник в деталях действий, которые использует Скотт

if (dinner == null) 
return View("NotFound");        
else
return View("Details", dinner); 

для возврата 404 сообщения Not Found.

Но в моем скачанном исходном коде для NerdDinner есть следующие строки:

        if (dinner == null) {
            return new FileNotFoundResult { Message = "No Dinner found for that id" };
        }

Это идет к FileNotFoundResult, где есть это:

public class FileNotFoundResult : ActionResult
{
    public string Message { 
        get; 
        set; 
    }

    public override void ExecuteResult(ControllerContext context) {
        throw new HttpException(404, Message);
    }
}

И это все. Как ссылка на представление NotFound.aspx сделана здесь? Мне не удалось выяснить, как это сопоставляется с NotFound.aspx, хотя NotFound.aspx действительно существует в папке просмотра Dinners. В web.config тоже ничего нет.

Приведенный выше код взят из набора изменений 41262, а не версии 1.0.

Вопрос (чтобы быть более ясным): почему «throw new HttpException (404, message)» возвращает представление NotFound ??

Кто-то, пожалуйста, объясните.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2010

Это одно из соглашений платформы ASP.Net MVC. Я настоятельно рекомендую прочитать некоторые учебные руководства и документацию по ASP.Net MVC, касающиеся соглашений фреймворка. Вот тот, что в Views .

Обычно, когда вы вызываете метод контроллера View(), это ярлык для того, чтобы явно указывать путь к файлу шаблона представления. Соглашение состоит в том, что платформа будет искать шаблон представления сначала в каталоге View контроллера, а затем в каталоге Shared. Он также достаточно умен, чтобы искать расширения .aspx и .ascx при поиске шаблона.

Вот почему, если вы хотите загрузить View, которого нет ни в одной из этих папок, вам нужно быть намного более явным. Например, чтобы загрузить частичное представление, отсутствующее в папке View текущего контроллера, необходимо указать полный путь к нему:

<% Html.RenderPartial("~/Views/SomeOtherController/SomeView.ascx") %>

вместо обычного

<% Html.RenderPartial("SomeView") %>
0 голосов
/ 16 февраля 2010

Когда генерируется исключение HttpException, оно в конечном итоге перехватывается средой выполнения asp.net, которая обрабатывает его, отображая страницу с ошибкой. Эту страницу ошибки можно настроить в параметре customErrors webConfig

<customErrors mode="RemoteOnly" defaultRedirect="/Dinners/Trouble">
            <error statusCode="404" redirect="/Dinners/Confused"/>

Вы уверены, что он все еще загружает страницу NotFound.aspx, а не Confused.aspx?

"Sorry - but the dinner you requested doesn't exist or was deleted."

а не

"Are you lost? Try taking a look at the complete list of ..."
0 голосов
/ 16 февраля 2010

Когда я загружал его, в папке Views \ Dinners было представление NotFound.aspx.

Обновление: как будто womp говорит, что очень неискренне задавать неясный вопрос, а затем понижать голос. Я подозреваю, что ответ на ваш уточненный вопрос заключается в том, что загруженный учебник использует исключение FileNotFoundResult в качестве заполнителя, и оно должно быть заменено представлением NotFound. Я быстро выполнил поиск в своем решении NerdDinner, к которому я остался после прохождения полного урока, а FileNotFoundResult нигде не используется.

...