如何在不使用jquery的情况下获取ASP.NET Core MVC应用程序中控制器操作中的TextBox值



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

我想在不使用jQuery或AJAX的情况下获得控制器内文本框中的可编辑值。我相信在ASP.NET核心功能方面一定有办法。

型号:

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 });
}
}
}

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

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

在我的例子中,当我使用@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)
{
...
}

注意:一个额外的选项是使用<input>标记而不是@Html.EditorFor()帮助程序:

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

尝试在<tr>:之外添加表单

<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>

由于名称属性与操作中的属性名称绑定,请尝试像这样更改操作:

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);
}

最新更新