#c# #asp.net-mvc #asp.net-mvc-4
#c# #asp.net-mvc #asp.net-mvc-4
Вопрос:
У меня есть следующая строка кода, которую я повторяю миллион раз, и там есть похожие коды.
public ActionResult View(int ? id)
{
if (id.HasValue == false)
{
return HttpNotFound();
}
.....
}
Как я могу сделать это короче?
Комментарии:
1. Это 2 строки кода, я не думаю, что сокращение этого до одной строки гарантирует дополнительный уровень сложности.
2. Я не думаю, что
HttpNotFound
это правильный статус в данном случае.3. что было бы лучше?
4. Вы можете попробовать написать action filter, так как это может привести к короткому замыканию рендеринга представления… Не уверен, будет ли он более компактным / читаемым…
Ответ №1:
Вы можете создать для него атрибут. Я мог бы выглядеть примерно так:
Атрибут
public class NullableValidatorAttribute : ActionFilterAttribute
{
protected String[] ParametersNames { get; set; }
public String HttpNotFoundStatusDescription { get; set; }
public NullableValidatorAttribute(params String[] parametersNames)
{
if (parametersNames == null)
throw new ArgumentNullException("parametersNames");
ParametersNames = parametersNames;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var parametersNames = new HashSet<String>(ParametersNames);
foreach (var parameterName in parametersNames)
{
var parameterValue = filterContext.ActionParameters[parameterName];
if (parameterValue == null)
{
filterContext.Result = new HttpNotFoundResult(HttpNotFoundStatusDescription);
return;
}
}
base.OnActionExecuting(filterContext);
}
}
Использование:
[NullableValidator("id", "id2", HttpNotFoundStatusDescription = "some description")]
public ViewResult Test(int? id, int? id2)
{
return View();
}
Это выше — просто сырая реализация. Например, вы можете удалить имена параметров из конструктора и разрешить любой параметр действия (получение типа параметра через отражение или что-то еще) и так далее.