C# 是否可以不使用“";如果;(asp.net mvc后期操作方法)
根据我们的代码,最好不要使用ifs。谁能告诉我在这段代码中是否有可能去掉ifC# 是否可以不使用“";如果;(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
[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;
}