C# 是否可以不使用“";如果;(asp.net mvc后期操作方法)

C# 是否可以不使用“";如果;(asp.net mvc后期操作方法),c#,asp.net-mvc,C#,Asp.net Mvc,根据我们的代码,最好不要使用ifs。谁能告诉我在这段代码中是否有可能去掉if [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(OrganisationInput organisationInput) { if (!this.ModelState.IsValid) { return View(organisationInput.RebuildInput<Organisation, Organ

根据我们的代码,最好不要使用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");
}
[AcceptVerbs(HttpVerbs.Post)]
公共行动结果创建(组织输入组织输入)
{
如果(!this.ModelState.IsValid)
{
返回视图(OrganizationInput.RebuildInput());
}
var Organization=OrganizationInput.BuildEntity();
这个。组织服务。创建(组织);
返回此.RedirectToAction(“索引”);
}

看起来是“if”的有效用法

政府似乎反对滥用if语句(即太多嵌套if)等,而不是完全根除它们

它们是必需的。

使用三元运算符:-)
更糟糕的是,它不是一个if。

在这种情况下,它是一个有效的if,因为它只能是两种状态中的一种。反if运动似乎更倾向于无休止的开放式if/else/switch立场。看起来这是一场不错的竞选

既然你在问:是的,这是可能的

使用返回ActionResult的抽象方法创建抽象类A,该抽象类是通过工厂方法创建的,工厂方法使用Func字典,该字典基于从模型计算的控制器状态(在本例中,是从controllerInstance.model.IsValid属性值)创建A子类实例

示例代码:

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");
  }
}
注意:当然,应该调整它以容纳原始问题中ifs之间的代码,这只是一个示例代码:)


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

包含ifs?没有


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

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

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

            return false;
        }

+我还建议您使用ReSharper,它可以帮助您消除不必要的If条件嵌套。ThanksIt似乎在推广用多态性替换条件重构-:D,我只是喜欢你开始的方式:“既然你在问”,顺便问一下,你能告诉我你是如何传入控制器的吗?有什么神奇的方法吗?你是如何做到的,在我看来,“私有控制器”也不能访问Controller.View和RedirectToAction,因为这些都是受保护的方法,当然我可以继承Controller并公开它们。实际上这里有很多东西都不起作用,但是它看起来很棒:)那你为什么还要重写GetHashCode和Equals呢?@Omu:你需要重写它们,因为ControllerState被用作包含创建委托的字典的键。控制器实例可以通过一些额外的注入机制注入,但这将比80 LOC稍多一点,所以我在这里省略了它;)撇开玩笑不谈……我发布的代码显然没有编译,我只是想表达一下想法,并说明删除一个if会带来多少开销:)我相信在不同的上下文中,这种模式会找到它的用法——而且不涉及if:)
 private static bool Result(bool isValid)
        {
            while(!isValid)
            {
                return true;
            }

            return false;
        }