我是 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 });
}
}
}
目前我只得到與單元格模板文本框系結的相同值。
請問如何確保在控制器中接收到文本框位置中更改的文本?
uj5u.com熱心網友回復:
在我的情況下,當我使用@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" />
uj5u.com熱心網友回復:
嘗試在外面添加一個表單<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>
并且由于 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/514898.html
標籤:C#asp.net-mvcasp.net 核心asp.net-core-3.1
上一篇:使用DI的授權需求處理程式
下一篇:drf從入門到精通
