Стреляя от бедра (ковбой, кодирующий ;-)), я предложил бы что-то вроде этого:
Контроллер:
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. Если Вам действительно не нужно многословие в этом образце, его метод хорошо работает также.
Используя MySQL (как вы, кажется, указываете тегами в вашем вопросе) , функция db_last_insert_id ()
определяется следующим образом:
function db_last_insert_id($table, $field) {
return db_result(db_query('SELECT LAST_INSERT_ID()'));
}
в database.mysql-common.inc
И LAST_INSERT_ID ()
зависит от соединения (цитата, выделено мной) :
ID, который был сгенерирован является хранится на сервере на на основе подключения. Это значит, что значение, возвращаемое функцией для данный клиент - первый
Значение AUTO_INCREMENT
создано для самое последнее заявление, касающееся Столбец AUTO_INCREMENT этим клиентом. На это значение не могут повлиять другие клиентов, даже если они создаютAUTO_INCREMENT
собственные значения. Такое поведение гарантирует, что каждый клиент может получить собственный идентификатор без забота о деятельности других клиентов , и без необходимости блокировки или транзакции.
Итак, я бы сказал, что это вполне нормально для MySQL; -)
Опубликованное вами определение на самом деле используется для PostGreSQL:
function db_last_insert_id($table, $field) {
return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
}
В database.pgsql.inc
Из руководства pgsql по последовательностям (цитата; выделено мной) :
currval
Возвращает последнее значение полученный nextval для этой последовательности в текущем сеансе . (Ошибка сообщается, если nextval никогда не был призвал к этой последовательности в этом сеанс.) Обратите внимание, что, поскольку это возвращает локальное значение сеанса, это дает предсказуемый ответ: или другие сеансы не выполнялись nextval, поскольку текущая сессия сделала .
Так что, я думаю, это тоже нормально для PostGreSQL.