【问题标题】:How to get the TextBox value in controller action in ASP.NET Core MVC application without using jquery如何在不使用 jquery 的情况下在 ASP.NET Core MVC 应用程序的控制器操作中获取 TextBox 值
【发布时间】:2022-10-15 23:21:15
【问题描述】:

我是 ASP.NET Core MVC 的新手。尝试制作一个简单的更新页面,其中模型(来自另一个数据服务)与表绑定。每行都有一个更新按钮。有一些字段映射到文本框并且是可编辑的。

我想在不使用 jQuery 或 AJAX 的情况下获取控制器内文本框中的可编辑值。我确信在普通的 ASP.NET Core 功能中必须有一种方法。

模型:

public class Employee
{
    public string Name { get; set; }
    public string Location { get; set; }
}

看法:

@model IEnumerable<AspNetCoreMVC.Models.Employee>

@{
    ViewData["Title"] = "Home";
}

<table class="table" style="width:fit-content">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(Model => Model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(Model => Model.Location)
            </th>
            <th>

            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.Name
                </td>
                <td>
                    @Html.TextBoxFor(m => item.Location)
                </td>
                <td>
                    @Html.ActionLink("Update","UpdateAction","Home",new { updatedLocation = item.Location })
                </td>
            </tr>
        }
    </tbody>
</table>

控制器:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using AspNetCoreMVC.Models;

namespace AspNetCoreMVC.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            var employees = new List<Employee>();
            employees.Add(new Employee { Name="Abcd", Location="abcdLocation1"});
            employees.Add(new Employee { Name = "Efgh", Location = "EfghLocation2" });
            return View(employees);
        }

        public IActionResult UpdateAction(string updatedLocation)
        {
            var employees = new List<Employee>();
            employees.Add(new Employee { Name = "Abcd", Location = "abcdLocation1" });
            employees.Add(new Employee { Name = "Efgh", Location = "EfghLocation2" });
            return View("Index", employees);
        }
        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

目前我只得到与单元格模板文本框绑定的相同值。

请问如何确保在控制器中接收到文本框位置中更改的文本?

【问题讨论】:

  • 使用&lt;form&gt; 并将该表单提交到服务器。目前你只有一个链接。

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


【解决方案1】:

在我的情况下,当我使用 @Html.EditorFor() 助手而不是 @Html.TextBoxFor() 助手并设置 name 属性时,这有效。

因此,请尝试以下操作:

<tbody>
    @foreach (var item in Model)
    {
        @using (Html.BeginForm("UpdateAction", "Home"))
        {                
            <tr>
                <td>
                    @item.Name
                </td>
                <td>     
                    @* Setting the `name` attribute explicitly *@               
                    @Html.EditorFor(m => item.Location, "name", "updatedLocation")
                </td>
                <td>
                    <div><input type="submit" value="Update" /></div>                  
                </td>
            </tr>
        }
    }
</tbody>

由于绑定上下文已经有updatedLocation 名称,您不需要在Html.BeginForm() 中定义它。

并且[HttpPost] 属性应该添加到UpdateAction() 操作方法声明中:

[HttpPost]
public IActionResult UpdateAction(string updatedLocation)
{
    ...
}

注意:另外一个选项是使用 &lt;input&gt; 标签而不是 @Html.EditorFor() 助手:

<input id="updatedLocation" name="updatedLocation" type="text" value="@item.Location" />

【讨论】:

  • 我试过了,但是我为链接“更新”设置了什么,以便从网页获取更新的文本框值? @Html.ActionLink("Update","UpdateAction","Home",new { updatedLocation = item.Location })
  • @hi_shobhit76:要制作你想要的东西(没有 JQuery),你必须使用 POST,但 @Html.ActionLink 执行 GET 动词。因此,我将@Html.ActionLink 替换为&lt;div&gt;&lt;input type="submit" value="Update" /&gt;&lt;/div&gt;。您是否尝试用上面答案中的代码片段替换代码中的 &lt;tbody&gt; 块?
  • 抱歉,我没有注意到其他变化。现在效果很好!
  • 我们如何通过我在文本框中所做的更改来捕获该行的整个模型。这有点像我们在 WPF 中的两种方式绑定,如果我们更改属性或控件值的更改,则会在执行期间反映出来。是否存在与 MVC 中的 html 控件进行两种方式绑定的概念?
  • @hi_shobhit76:问)我们如何通过更改捕获该行的整个模型......? 一个)WPF 和 MVC 使用完全不同的方法进行数据绑定。如果在 WPF 中我们有实时连接在 MVC 中源和目标之间(通过实现 INotifyPropertyChanged 接口)我们没有它。 MVC 中的服务器和客户端之间的连接基于无状态的 HTTP 协议。这意味着每个请求都是独立处理的。见Model Binding in ASP.NET Core
【解决方案2】:

尝试在&lt;tr&gt;之外添加一个表单:

<tbody>
        @foreach (var item in Model)
        { 
        <form asp-action="UpdateAction" asp-controller="Home" >
            <tr>
                <td>
                    @item.Name
                </td>
                <td>
                    @Html.TextBoxFor(m => item.Location)
                </td>
                <td>
                    <input type="submit" value="Update" />
                </td>
            </tr>
        </form>
        }
    </tbody>

并且由于 name 属性与实际的属性名称绑定,因此请尝试像这样更改您的操作:

public IActionResult UpdateAction(string Location)
        {
            var employees = new List<Employee>();
            employees.Add(new Employee { Name = "Abcd", Location = "abcdLocation1" });
            employees.Add(new Employee { Name = "Efgh", Location = "EfghLocation2" });
            return View("Index", employees);
        }

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2011-09-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多