【问题标题】:How to use buttons in Asp.Net to call a method如何使用 Asp.Net 中的按钮调用方法
【发布时间】:2017-06-08 20:18:49
【问题描述】:

我正在尝试使用按钮的 onClick 事件使视图中的按钮调用模型中的方法,但我不确定如何使其工作。按钮什么都不做。

这是我的观点:

<html>
<body>
    <div>
        <p>Coins: @Model.Coins</p>
        <button type="button" id="btnScore"
                onclick="Btn_Click">Click me!</button>
    </div>
</body>
</html>

这是我尝试调用该方法的模型:

public class ClickerGame

    {
        public int Coins { get; set; }

        public ClickerGame()
        {
            Coins = 0;
        }

        public void Btn_Click()
        {
            Coins++;
        }
}

这是控制器:

public class ClickerController : Controller
    {
        // GET: /<controller>/
        public IActionResult Index()
        {
            ClickerGame model = new ClickerGame();
            return View(model);
        }
    }

这是我的 Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Clicker}/{action=Index}/{id?}");
        });
    }
}

我能够在视图中调用@Model.Coins 获得硬币数量,但是当我尝试使用@Model.Btn_Click 时,它给了我一个错误,提示该方法无法转换为委托对象。 我在 Visual Studio 中使用 Asp.Net Core 1.0.1。

编辑: 我更改了控制器和视图,它现在可以调用该方法,但是当它尝试增加 coin 变量时,我得到一个 NullReference 异常......

观点:

@model AspNetClicker.Models.ClickerGame

<script>
    function IncrementCount()
    {
        location.href = "@Url.Action("IncrementCount")";
    }
</script>


<html>

<body>
    <div>
        <p>Coins: @Model.Coins</p>
        <button type="button" id="btnScore"
                onclick="IncrementCount()">
            Click me!
        </button>
    </div>
</body>
</html>

点击游戏:

public class ClickerGame

    {
        public int Coins { get; set; }

        public ClickerGame()
        {
            Coins = 0;
        }
}

点击控制器:

public class ClickerController : Controller
{
    ClickerGame model;

    public IActionResult Index()
    {
        model = new ClickerGame();
        return View(model);
    }

    public void IncrementCount()
    {
        model.Coins++;
    }
}

【问题讨论】:

  • 据我所知 onclick 应该有一个 javascript 调用。还有其他调用 .NET 方法的方法(如回调等),但它不能是您编写的方式。您可能需要编写一个 javascript 方法“Btn_Click”。关于错误消息,您需要在按钮 HTML 标记的 onclick 中的 Btn_Click 旁边放置空括号
  • 你没有使用任何内置模板或ajax调用,他们怎么能调用点击事件......它不是.aspx,它是mvc。
  • 可能你混合了 aspnet webforms 和 mvc 方法。您可以开始阅读官方的 aspnet 核心文档。 docs.microsoft.com/en-us/aspnet/core/mvc/overview
  • 您不能从 Javascript 调用任何旧 .NET 类的特定方法。在 ASP.NET 的 MVC 风格中,您必须在 Controller 中创建一个 Action 方法。让您的 javascript 向操作发出请求(通过回发、ajax 或只是重定向,具体取决于用例),然后在操作方法中,您可以调用任何其他必要的 .NET 方法以正确处理请求。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

不可能像在网络表单中那样做到这一点。 我将简要解释一下。请实施。 按照以下步骤使其在 MVC 中工作:

1.将您的视图代码更改为以下代码:

<html>
<body>
    <div>
        <p>Coins: @Model.Coins</p>
        <button type="button" id="btnScore"
                onclick="IncrementCount()">Click me!</button>
    </div>
</body>

<script>
function IncrementCount() {
    $.ajax({
        type: "POST",
        url: "/Clicker/IncrementCount",       
        async: true,
        success: function (msg) {
            ServiceSucceeded(msg);
        },
        error: function () {
            return "error";
        }
    });
}
</script>

</html>

2。在您的控制器中添加一个操作方法 IncrementCount 并在此处增加计数。

public class ClickerController : Controller
{       
    [HttpPost]
    public void IncrementCount()
    {
        // 
    }
}

【讨论】:

  • 我已经实现了你给我的代码,它可以工作对我来说很有意义,但是调试器不会在我添加到 ClickerController.IncrementCount() 的断点处停止。我是否也需要编辑我的 Mvc 路由?
  • 它对我不起作用,即使我的答案与您在答案中所说的完全一样。当我在 Ajax 代码上设置断点时,我收到警告,断点也不会被命中。
  • 如果你等一下,我会测试解决方案并检查我身边是否有任何问题。
  • @ViVi 而不是url: "/ClickerController/IncrementCount" 这样做会更健壮url: '@Url.Action("IncrementCount", "ClickerController")' - 这将确保点击正确的URL。然后,在生成 URL 时,MVC 会考虑任何不寻常的路由配置或托管安排。在此示例中,可能没有命中断点,因为 URL 对于 OP 的环境是错误的。 OP 应该检查网络选项卡是否有任何 HTTP 错误(可能是 404)
【解决方案2】:

试试这个

<input type="button" value="Click me!" onclick="nextUrl()"/>

 function nextUrl() {
    location.href = "/Home/Contact";
}

【讨论】:

  • 我尝试了类似的方法并编辑了我的问题以显示我的最新代码。可悲的是,这给了我一个不同的问题。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多