是否可以在不使用“if”(asp.net mvc post action方法)的情况下执行此操作

时间:2009-12-09 12:01:06

标签: c# asp.net-mvc

根据anti-if campaign,最好不要在我们的代码中使用ifs。任何人都可以告诉我是否有可能摆脱这段代码中的if?

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create(OrganisationInput organisationInput)
 {
    if (!this.ModelState.IsValid)
    {
       return View(organisationInput.RebuildInput<Organisation, OrganisationInput>());
    }

   var organisation = organisationInput.BuildEntity<Organisation, OrganisationInput>();
   this.organisationService.Create(organisation);

   return this.RedirectToAction("Index");
}

5 个答案:

答案 0 :(得分:13)

看起来像是“if”的有效用途。

anti-if campaign似乎违反了滥用 if ifments(即嵌​​套ifs太多)等,而不是完全根除它们。

他们是必要的。

答案 1 :(得分:4)

因为你问:是的,有可能。

使用返回ActionResult的抽象方法创建一个抽象类,该方法通过工厂方法创建,该方法使用Func的字典,该字典基于从模型计算的Controller状态创建A子类实例(在您的情况下,来自controllerInstance.Model) .IsValid属性值)。

示例代码:

public abstract class ModelStateValidator
{
  private Controller controller;

  protected Controller Controller {
    get { return controller; }
  }

  public abstract ActionResult GetResult();

  #region initialization
  static ModelStateValidator() {
    creators[ControllerState.InvalidModel] = () => new InvalidModelState();
    creators[ControllerState.ValidModel] = () => new ValidModelState();
  }
  #endregion
  #region Creation
  private static Dictionary<ControllerState, Func<ModelStateValidator>> creators = new Dictionary<ControllerState, Func<ModelStateValidator>>();

  public static ModelStateValidator Create(Controller controller) {
    return creators[GetControllerState(controller)]();
  }

  private static ControllerState GetControllerState(Controller c) {
    return new ControllerState(c);
  }

  internal class ControllerState
  {
    private readonly Controller controller;
    private readonly bool isModelValid;

    public ControllerState(Controller controller)
      : this(controller.ModelState.IsValid) {
      this.controller = controller;
    }

    private ControllerState(bool isModelValid) {
      this.isModelValid = isModelValid;
    }

    public static ControllerState ValidModel {
      get { return new ControllerState(true); }
    }

    public static ControllerState InvalidModel {
      get { return new ControllerState(false); }
    }

    public override bool Equals(object obj) {
      if (obj == null || GetType() != obj.GetType())  //I can show you how to remove this one if you are interested ;)
      {
        return false;
      }

      return this.isModelValid == ((ControllerState)obj).isModelValid;
    }

    public override int GetHashCode() {
      return this.isModelValid.GetHashCode();
    }
  }

  #endregion
}

class InvalidModelState : ModelStateValidator
{
  public override ActionResult GetResult() {
    return Controller.View(organisationInput.RebuildInput<Organisation, OrganisationInput>());
  }
}

class ValidModelState : ModelStateValidator
{
  public override ActionResult GetResult() {
    return this.Controller.RedirectToAction("Index");
  }
}

另外80行,4个新类删除单个if。

你的用法,而不是if,调用这样的方法:

ActionResult res =  ModelStateValidator.Create(this).GetResult();

注意:当然应该调整它来修改原始问题中ifs之间的代码,这只是一个示例代码:)


增加额外的不必要的复杂性? YES。

包含ifs? NO。

你应该用吗?自己回答:)

答案 2 :(得分:1)

使用三元运算符:-) 情况更糟,但不是if。

答案 3 :(得分:0)

在这种情况下,它是有效的,因为它只能是两种状态之一。反if运动似乎更适合无休止的开放式if / else / switch语句。看起来像一个很好的活动!

答案 4 :(得分:0)

你可以使用While循环......但这似乎是一个美化的if语句。

 private static bool Result(bool isValid)
        {
            while(!isValid)
            {
                return true;
            }

            return false;
        }