【问题标题】:ASP.Net 5.0 Call Controller Function on Button/Link Click in ViewASP.Net 5.0 在按钮/链接上调用控制器功能单击视图
【发布时间】:2021-07-22 03:38:55
【问题描述】:

我只是在学习 ASP.NET Core 5.0 和 Entity Framework Core。我的一个控制器中有一个简单的功能,可以在单击时将数字 1 添加到数据库中。

当我单击链接时,该值已正确添加到数据库中,但视图崩溃。如果我在初始页面加载时调用该函数,它可以正常工作,但是通过单击按钮调用它对我不起作用。要么什么都没有发生,要么调用了函数但我得到了一个空引用异常,这取决于我的尝试。

MyAppController.cs

public IActionResult InsertNewActionNumber()
{            
    _context.RGWActions.Add(new RGWAction { ReduceMeat = 1 });
    _context.SaveChanges();
    Debug.WriteLine("*******************TEST2********************TEST2*********************");
    return View();
}

链接在MyApp.cshtml:

<td class="d-none d-sm-none d-md-none d-lg-table-cell d-xl-table-cell" style="vertical-align:middle; text-align:center;">
    <a href="@Url.Action("InsertNewActionNumber", "MyApp")">
        <img src="@Model.MouseClickIconThumbnailUrl" id="MouseClickIconRow1" width="20" height="35" alt="Mouse Click Here Image">
    </a>
</td>

当我单击链接时,该值已正确添加到数据库中,但我在视图本身的第一行 return View(); 上遇到了空引用异常 ViewData["Title"] = _loc[Model.PageTabTitle];

@model MyAppViewModel
@using Microsoft.AspNetCore.Identity
@using MyApp.Data
@using System.Globalization
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@{
    ViewData["Title"] = _loc[Model.PageTabTitle];
}

我也试过了:

  1. 按this link 进行点击。但该函数根本没有被调用。
  2. @Using 根据this link。也没有欢乐。
  3. Razor 语法 &lt;a href="" asp-action="InsertNewActionNumber" asp-controller="ReduceGlobalWarming"&gt;&lt;/a&gt; 但我收到 InvalidOperationException: Cannot override the 'href' attribute for 错误。
  4. 前 10 或 15 个结果的变体来自 google 和堆栈溢出。

任何关于我做错了什么的帮助将不胜感激?

【问题讨论】:

  • 因此,您的视图需要一个模型,并且您不会从控制器将模型返回到您的视图。对我来说,这似乎是一个很好的 AJAX 调用案例,而不是使用按钮发布到控制器。我这么说是因为您的控制器方法似乎并没有在整个模型上运行,而只是增加了一个属性。

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


【解决方案1】:

您需要将模型发送到您的视图。这是它崩溃的方式:

public IActionResult InsertNewActionNumber()
{            
    _context.RGWActions.Add(new RGWAction { ReduceMeat = 1 });
    _context.SaveChanges();
    
 var model= ....your code

    return View(model);
}

或者您必须调用获取插入表单操作而不是再次创建模型

public IActionResult InsertNewActionNumber()
{ 
_context.RGWActions.Add(new RGWAction { ReduceMeat = 1 });
    _context.SaveChanges();
 
    return GetActionNumber(); // <= replace with your get action name
}

【讨论】:

  • 谢谢,这有帮助,但我现在得到一个不同的错误“System.InvalidOperationException:未找到视图'InsertNewActionNumber'。搜索了以下位置:”我不知道为什么它在寻找具有该名称的视图,这是我在 元素中指定的函数的名称。
  • 按照惯例/默认,asp.net MVC 控制器使用视图的方法名称(即 insertnewactionnumber.cshtml)。你需要有这个视图views/MyApp/insertnewactionnumber.cshtml。
  • 这只是一个空视图 - 一个空的 .cshtml 文件吗?显然我的函数名称不必与按钮所在视图的名称匹配,或者我只能有一个函数?同样,我不能为每个功能都提供完全填充的视图,否则我的应用会因每个页面的副本而臃肿?
  • 谢谢。我也想给你同样的建议。我通常使用保存视图来添加新的和更新或编辑操作。在 addnew 操作结束时,我通常调用 edit 操作返回带有新数据的相同视图。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多