Что надлежащий путь состоит в том, чтобы отправить ответу HTTP 404 от действия MVC ASP.NET?

Просто фиксируйте предыдущие ответы так, чтобы соотношение находилось между 0 и 1 (с использованием Python):

    # (x1,y1) top-left coord, (x2,y2) bottom-right coord, (w,h) size
    A = {'x1': 0, 'y1': 0, 'x2': 99, 'y2': 99, 'w': 100, 'h': 100}
    B = {'x1': 0, 'y1': 0, 'x2': 49, 'y2': 49, 'w':  50, 'h':  50}

    # overlap between A and B
    SA = A['w']*A['h']
    SB = B['w']*B['h']
    SI = np.max([ 0, 1 + np.min([A['x2'],B['x2']]) - np.max([A['x1'],B['x1']]) ]) * np.max([ 0, 1 + np.min([A['y2'],B['y2']]) - np.max([A['y1'],B['y1']]) ])
    SU = SA + SB - SI
    overlap_AB = float(SI) / float(SU)
    print 'overlap between A and B: %f' % overlap_AB

    # overlap between A and A
    B = A
    SB = B['w']*B['h']
    SI = np.max([ 0, 1 + np.min([A['x2'],B['x2']]) - np.max([A['x1'],B['x1']]) ]) * np.max([ 0, 1 + np.min([A['y2'],B['y2']]) - np.max([A['y1'],B['y1']]) ])
    SU = SA + SB - SI
    overlap_AA = float(SI) / float(SU)
    print 'overlap between A and A: %f' % overlap_AA

Выход будет:

    overlap between A and B: 0.250000
    overlap between A and A: 1.000000
90
задан Daniel Schaffer 31 January 2009 в 23:48
поделиться

4 ответа

Стреляя от бедра (ковбой, кодирующий ;-)), я предложил бы что-то вроде этого:

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return new HttpNotFoundResult("This doesn't exist");
    }
}
<час>

HttpNotFoundResult:

using System;
using System.Net;
using System.Web;
using System.Web.Mvc;

namespace YourNamespaceHere
{
    /// <summary>An implementation of <see cref="ActionResult" /> that throws an <see cref="HttpException" />.</summary>
    public class HttpNotFoundResult : ActionResult
    {
        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with the specified <paramref name="message"/>.</summary>
        /// <param name="message"></param>
        public HttpNotFoundResult(String message)
        {
            this.Message = message;
        }

        /// <summary>Initializes a new instance of <see cref="HttpNotFoundResult" /> with an empty message.</summary>
        public HttpNotFoundResult()
            : this(String.Empty) { }

        /// <summary>Gets or sets the message that will be passed to the thrown <see cref="HttpException" />.</summary>
        public String Message { get; set; }

        /// <summary>Overrides the base <see cref="ActionResult.ExecuteResult" /> functionality to throw an <see cref="HttpException" />.</summary>
        public override void ExecuteResult(ControllerContext context)
        {
            throw new HttpException((Int32)HttpStatusCode.NotFound, this.Message);
        }
    }
}
// By Erik van Brakel, with edits from Daniel Schaffer :)

Используя этот подход Вы соответствуете стандартам платформы. Там уже существует HttpUnauthorizedResult, таким образом, это просто расширило бы платформу в глазах другого разработчика, поддерживающего Ваш код позже (Вы знаете, психо, кто знает, где Вы живете).

Вы могли использовать отражатель для взгляда в блок, чтобы видеть, как HttpUnauthorizedResult достигается, потому что я не знаю, пропускает ли этот подход что-нибудь (это кажется слишком простым почти).

<час>

я действительно использовал отражатель для взгляда на HttpUnauthorizedResult сейчас. Кажется, что они устанавливают StatusCode на ответе на 0x191 (401). Хотя это работает на 401, с помощью 404 как новое значение я, кажется, получаю просто пустую страницу в Firefox. Internet Explorer показывает значение по умолчанию 404 хотя (не версия ASP.NET). Используя панель инструментов веб-разработчика я осмотрел заголовки в FF, которые показывают 404 Не Найденный ответ. Могло быть просто что-то, в чем я неправильно сконфигурировал И следующие

<час>

Это сказанное, я думаю, что подход Jeff является прекрасным примером KISS. Если Вам действительно не нужно многословие в этом образце, его метод хорошо работает также.

68
ответ дан Erik van Brakel 5 November 2019 в 14:20
поделиться

Мы делаем это как так; этот код найден в BaseController

/// <summary>
/// returns our standard page not found view
/// </summary>
protected ViewResult PageNotFound()
{
    Response.StatusCode = 404;
    return View("PageNotFound");
}

названным как так

public ActionResult ShowUserDetails(int? id)
{        
    // make sure we have a valid ID
    if (!id.HasValue) return PageNotFound();
46
ответ дан Jeff Atwood 5 November 2019 в 14:20
поделиться
throw new HttpException(404, "Are you sure you're in the right place?");
19
ответ дан yfeldblum 5 November 2019 в 14:20
поделиться

HttpNotFoundResult - отличный первый шаг к тому, что я использую. Возвращение HttpNotFoundResult - это хорошо. Тогда возникает вопрос: что дальше?

Я создал фильтр действий под названием HandleNotFoundAttribute, который затем показывает страницу с ошибкой 404. Поскольку он возвращает представление, вы можете создать специальное представление 404 для каждого контроллера или позволить использовать общее представление 404 по умолчанию. Это будет вызвано даже тогда, когда в контроллере отсутствует указанное действие, потому что инфраструктура генерирует исключение HttpException с кодом состояния 404.

public class HandleNotFoundAttribute : ActionFilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        var httpException = filterContext.Exception.GetBaseException() as HttpException;
        if (httpException != null && httpException.GetHttpCode() == (int)HttpStatusCode.NotFound)
        {
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; // Prevents IIS from intercepting the error and displaying its own content.
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.NotFound;
            filterContext.Result = new ViewResult
                                        {
                                            ViewName = "404",
                                            ViewData = filterContext.Controller.ViewData,
                                            TempData = filterContext.Controller.TempData
                                        };
        }
    }
}
7
ответ дан 24 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: