Я передаю модель в представление, а затем хочу изменить user.BannEndDate в представлении и отправить его обратно в контроллер. Независимо от того, что я буду делать с пользователем. BannEndDate ActionLink всегда передает значение, которое было установлено полученной моделью. Кто-нибудь может мне с этим помочь?

[Модель ]

[DataType(DataType.Date)]
public DateTime? BannEndDate { get; set; }

[Вид]

@foreach (var user in Model.Users)
{
    @Html.ActionLink("Bann", "BannUser", "Account", new { userId = user.Id, bann = true, bannEndDate = user.BannEndDate} , null)
    @Html.EditorFor(u => user.BannEndDate)
}

[ Контроллер ]

public ActionResult BannUser(string userId, bool bann, DateTime? bannEndDate){}
0
chrisk 25 Июл 2017 в 22:53
1
Это ожидаемое поведение, потому что ActionLink отображается, а user.BannEndDate является предыдущим значением. Такова природа серверной инфраструктуры, такой как ASP.NET MVC. Если вы хотите отправить его обратно на сервер, поместите его в форму и отправьте. Если вы хотите, чтобы ActionLink обновлялся на стороне клиента, вам необходимо использовать код на стороне клиента. Другими словами, JavaScript. Здесь, в Stack Overflow, есть ряд вопросов о том, как это сделать.
 – 
Heretic Monkey
25 Июл 2017 в 23:17
Хорошо, я думал, что editorfor тоже обновит значение на стороне клиента. Спасибо за ответ
 – 
chrisk
26 Июл 2017 в 00:00
Вместо того, чтобы использовать ActionLink(), просто используйте форму с FormMethod.Get, которая отправит значение текстового поля в ваш метод GET (javascript не требуется)
 – 
user3559349
26 Июл 2017 в 01:53
Да, но тогда мне нужно создать форму для каждого текстового поля, я думал, что могу передать Model by Razor без формы. Это тоже хорошая идея, но я думаю, что JavaScript легче?
 – 
chrisk
26 Июл 2017 в 02:23
Чтобы быть ясным, моя цель - щелкнуть ссылку и обновить БД по значению datepicker, поэтому я думаю, что формы предназначены для сбора данных, а не для обновления одной записи, возможно, я ошибаюсь, пожалуйста, поправьте меня
 – 
chrisk
26 Июл 2017 в 02:30

1 ответ

Лучший ответ

Как уже сказал Майк МакКоган, значения для @Html.ActionLink статичны, поскольку они записываются, когда вы вызываете страницу.

Что вы можете сделать, так это дать вашим ActionLink и EditorFor конкретный идентификатор.

@Html.ActionLink("Bann", "BannUser", "Account", new { userId = user.Id, bann = true, bannEndDate = user.EndDate }, new { @id = "TargetLink_" + user.Id })
@Html.EditorFor(m => user.BannEndDate, null, "BannEndDate_" + user.Id)

После этого вы можете прослушивать изменения в этих элементах управления через jQuery и изменять ActionLink (userId = 3 приведет к BannEndDate_3 и TargetLink_3):

$('input[id*="BannEndDate_"]').change((e) => {
    var userId = e.target.id.substr(e.target.id.indexOf("_") + 1);
    var link = $("#TargetLink_" + userId).attr('href');
    $("#TargetLink_" + userId).attr('href', link.replace(/(bannEndDate=.*$)/g, 'bannEndDate=' + encodeURIComponent($("#" + e.target.id).val())));
});
0
jAC 25 Июл 2017 в 23:44
Спасибо за отличный ответ, я думал, что Razor немедленно обновит модель во всей области сайта, и каждый метод изменит значение ссылочного объекта, но это был неправильный путь.
 – 
chrisk
26 Июл 2017 в 00:13
Если вы действительно хотите это сделать, просто используйте методы POST ([HttpPost]) и передайте Model контроллеру.
 – 
jAC
26 Июл 2017 в 19:20