Обнуляемый ярлык или расширение для параметров

#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();
}
  

Это выше — просто сырая реализация. Например, вы можете удалить имена параметров из конструктора и разрешить любой параметр действия (получение типа параметра через отражение или что-то еще) и так далее.