#c# #asp.net #asp.net-mvc #entity-framework
#c# #asp.net #asp.net-mvc #entity-framework
Вопрос:
Чего я хочу добиться: мне нужна функция, которая выбирает несколько записей со страницы индекса на моем asp.net веб-сайт mvc, которые перенаправляются на другую веб-страницу, где их можно массово редактировать.
Для этого я использую флажки, но я не знаю, как я могу получить доступ к содержимому этого массива из другого действия и представления.
На данный момент это код, который я сделал:
Представление индекса:
@model IEnumerable<BulkDelete.Models.Employee>
@TempData["employeeIdsToDelete"];
<div style="font-family:Arial">
@using (Html.BeginForm("checking", "Home", FormMethod.Post))
{
<table class="table">
<thead>
<tr>
<td>Checkbox<br /></td>
<th>Name</th>
<th>Gender</th>
<th>Email</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td><input type="checkbox" name="employeeIdsToDelete" id="employeeIdsToDelete" value="@item.ID" /></td>
<td>@item.Name</td>
<td>@item.Gender</td>
<td>@item.Email</td>
</tr>
}
</tbody>
<br />
</table>
<input type="submit" value="Delete selected employees" />
}
</div>
Действия контроллера:
public class HomeController : Controller
{
SampleDBContext db = new SampleDBContext();
public ActionResult Index()
{
return View(db.Employees.ToList()) ;
}
[HttpPost]
public ActionResult UpdateMultipleRecords(IEnumerable<int> employeeIdsToUpdate)
{
return checking(employeeIdsToUpdate);
}
public ActionResult checking(IEnumerable<int>employeeIdsToUpdate)
{
foreach (var e in employeeIdsToUpdate)
{
Employee em = new Employee();
em = db.Employees.Find(e);
em.Name = ViewBag.Signature;
db.Entry(em).State = EntityState.Modified;
db.SaveChanges();
}
return View();
}
Комментарии:
1. Другое действие = другой запрос. Существуют очевидные способы передачи данных между запросами: использовать контейнер сеанса на сервере, использовать строку запроса, использовать cookie. В вашем случае я бы выбрал первое.
Ответ №1:
Вместо публикации на индексной странице. разместите форму на другой странице.
@using (Html.BeginForm("{actionNameOfAnotherPage}", "{anotherPageControllerName}", FormMethod.Post))
При публикации массива данных используйте индексацию массива для входных данных формы.
@{ var index = 0;}
@foreach (var item in Model)
{
<tr>
<td><input type="checkbox" name="[@index]employeeIdsToDelete" class="mycheckbox" id="employeeIdsToDelete" value="@item.ID" /></td>
<td>@item.Name</td>
<td>@item.Gender</td>
<td>@item.Email</td>
</tr>
@{
index ;
}
}
Комментарии:
1. По какой-то причине при его передаче нет данных, как вы мне показали. Он продолжает указывать нулевую ссылку на объект
2. Ссылка на объект не установлена для экземпляра объекта. Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта. Ошибка источника: строка 30: Строка 31: Строка 32: foreach (переменная в employeeIdsToUpdate) Строка 33: { Строка 34: Employee em = new Employee();
Ответ №2:
Вы также можете отправить их как Ajax
вызов, и в этом сценарии вы также можете сделать это без формы.
<div style="font-family:Arial">
<table class="table">
<thead>
<tr>
<td>Checkbox<br /></td>
<th>Name</th>
<th>Gender</th>
<th>Email</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td><input type="checkbox" name="employeeIdsToDelete" class="mycheckbox" id="employeeIdsToDelete" value="@item.ID" /></td>
<td>@item.Name</td>
<td>@item.Gender</td>
<td>@item.Email</td>
</tr>
}
</tbody>
<br />
</table>
<input type="button" onClick="deleteEmployees()" value="Delete selected employees" />
</div>
и ниже вашей html
страницы
<script>
function deleteEmployees() {
var checkboxes = document.getElementsByClassName("mycheckbox");
var checkedValues = [];
for (var i = 0; i < checkboxes.length; i ) {
if (checkboxes[i].checked) {
console.log(i);
checkedValues.push(checkboxes[i].value)
}
}
console.log(checkedValues);
$.ajax({
type: "POST",
url: '@Url.Action("YourAction", "YourController")',
data: { employeeIdsToUpdate: checkedValues },
success: function (res) {
if (res.ok) {
window.location = res.returnURL;
}
},
error: function (req, status, error) {
console.log(error);
}
});
}
</script>
и в вашем POST ACTION
вы можете принимать эти значения
[POST]
public ActionResult UpdateEmployees(int[] employeeIdsToUpdate)
{
foreach (int e in employeeIdsToUpdate)
{
Employee em = new Employee();
em = db.Employees.Find(e);
em.Name = ViewBag.Signature;
db.Entry(em).State = EntityState.Modified;
db.SaveChanges();
}
return Json(new { ok = true, returnURL = Url.Action(nameof("YOUR VIEW IN HERE"))});
}
Ответ №3:
Вот несколько вариантов отправки массива из представления в какое-либо действие контроллера:
- Отправьте форму в действие вашего контроллера
- Отправьте ajax-вызов вашему действию контроллера
- Гиперссылка MVC, указывающая на действие вашего контроллера
Вот несколько вариантов отправки массива из действия контроллера в какое-либо другое действие контроллера:
- Сохранение данных в TempData (доступно для всех контроллеров)
- Сохранение данных в памяти браузера (временное хранилище)
- Сохранение данных в БД
- Сохранение данных в объекте сеанса
- Сохранение данных в объекте кэша
и, пожалуйста, не забудьте отметить это как ответ… Спасибо