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