ASP.NET, C# |如何在控制器中使用方法(和返回值)?

Posted

技术标签:

【中文标题】ASP.NET, C# |如何在控制器中使用方法(和返回值)?【英文标题】:ASP.NET, C# | How to use a method (and the returned value) with a controller? 【发布时间】:2021-02-09 17:45:56 【问题描述】:

我正在做一个学校项目,但我被困住了。我正在尝试从用户那里获取一些信息,并根据用户输入的信息计算一些事情。

我的代码正在运行,但我的老师告诉我需要将计算替换到我的逻辑层(它们在我的控制器中)。我正在尝试这样做,但我被卡住了。

这是我的控制器:

 public class CalculatorController : Controller
    
        // GET: Calculator
        public ActionResult PackCalculator()
        
            return View(new CalculatorModel());
        

        [HttpPost]
        public ActionResult PackCalculator(CalculatorModel calculator)
        
            CalculatorLogic x = new CalculatorLogic();
            int Y = x.calculator(new CalculatorModel());
            return View(calculator);

        

这是逻辑层中的类:

namespace ApexLogic

   public class CalculatorLogic
    
        public int calculator(CalculatorModel calculator)
        
            if (calculator.CurrentLevel < 21)
            
                calculator.CurrentPack = calculator.CurrentPack + (calculator.CurrentLevel - 1);
                int seizoenPacks = calculator.PlayedSeasons * 5;
                int BattlepassPacks = calculator.Battlepass * 12;
                int CurrentPack = calculator.CurrentPack + seizoenPacks + BattlepassPacks + calculator.BoughtPacks;
                return CurrentPack;
            

            else if (calculator.CurrentLevel > 21 && calculator.CurrentLevel < 301)
            
                int CurrentLevelPack = calculator.CurrentLevel - 20;
                int PackCalculator2 = (calculator.CurrentLevel / 2);
                int CurrentLevelPack2 = PackCalculator2 + 19;
                int seizoenPacks = calculator.PlayedSeasons * 5;
                int BattlepassPacks = calculator.Battlepass * 12;
                calculator.CurrentPack = calculator.CurrentPack + seizoenPacks + BattlepassPacks +
                                         calculator.BoughtPacks + CurrentLevelPack2;
                return calculator.CurrentPack;


            

            else if (calculator.CurrentLevel > 300 && calculator.CurrentLevel <= 500)
            
                int CurrentLevelPack = calculator.CurrentLevel - 300;
                int PackCalculator2 = (CurrentLevelPack / 5);
                int CurrentLevelPack2 = PackCalculator2 + 159;
                int seizoenPacks = calculator.PlayedSeasons * 5;
                int BattlepassPacks = calculator.Battlepass * 12;
                calculator.CurrentPack = calculator.CurrentPack + seizoenPacks + BattlepassPacks +
                                         calculator.BoughtPacks + CurrentLevelPack2;
                return calculator.CurrentPack;
            
            else
            
                return 0;

            
        
    

当我尝试使用断点查看哪里出错时,我可以看到来自用户的输入被正确定向到类,但我的计算没有完成,我总是返回 0。我现在不知道该怎么办(通常我会用断点来修复它,但它们对我没有帮助)

The user input

It is handled correctly as you can see

但我在控制器中的 Y 始终保持为零。 如果我使用第一个 if 语句中的 return 方式,或者我在第二个或第三个 if 语句中使用 return 方式,这没有区别。 有人可以帮我吗?

【问题讨论】:

【参考方案1】:

你的模型是 null ,首先你必须填写你的模型。像这样更改您的代码,

 [HttpPost]
        public ActionResult PackCalculator(CalculatorModel calculator)
        
            CalculatorLogic x = new CalculatorLogic();
            int Y = x.calculator(new CalculatorModel());
            return View(calculator);

        

 [HttpPost]
        public ActionResult PackCalculator(CalculatorModel calculator)
        
            CalculatorLogic x = new CalculatorLogic();
            var model = new CalculatorModel()
            CurrentLevel = 12,
            CurrentLevelPack = 10 .....
            ;
            int Y = x.calculator(model);
            return View(calculator);

        

【讨论】:

CurrentLevel 等不是静态的,我不能给它一个数字,因为用户必须这样做。【参考方案2】:

您正在将new CalculatorModel 传递给您对应用程序逻辑类的调用:

int Y = x.calculator(new CalculatorModel()); //This is what is messing you up

改成这样:

int Y = x.calculator(calculator); //Use the model parameter which is passed into your Post method

【讨论】:

以上是关于ASP.NET, C# |如何在控制器中使用方法(和返回值)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# asp.net 从 url 获取数据?

C# Asp net core 如何在控制器之外调用数据库上下文

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

ASP.NET C# 如何在程序中控制IIS服务或应用程序池重启?

我的 C++ 程序集是如何从 C# 控制台应用程序而不是 ASP.NET 中看到的?

ASP.NET MVC / C#:如何显示属于另一个控制器的部分视图数据