У меня есть какой-то мессенджер, у него есть панель, на которой я вижу все свои контакты. Я хочу, чтобы я нажимал на один из них, чтобы передать телефонный номер и Идентификатор моему Контроллер, чтобы отправить сообщение и сохранить его в базе данных.
Foreach печатает все мои контакты:
@foreach (var contact in Model.Contacts)
{
<div class = "chatperson" onclick = "get_contact_number(@contact.PhoneNumber , @contact.ContactId)">
<div class = "namechat">
<div class = "pname">
@contact.Name
<a asp-action = "ContactDetails" asp-route-id = "@contact.ContactId" class = " glyphicon glyphicon-info-sign"></a>
<a asp-action = "EditContact" asp-route-id = "@contact.ContactId" class = " glyphicon glyphicon-pencil "></a>
</div>
<div class = "lastmsg">@contact.PhoneNumber </div>
</div>
</div>
}
В div я использовал метод JS и передавал туда значения:
function get_contact_number(contactNumber, contactId) {
@Model.PhoneNr = contactNumber;
@Model.ContactId = contactId;
}
Наконец, я хочу передать эти значения функции моего контроллера
public IActionResult SendMessage(MessengerViewModel model, string phoneNumber, string message)
{
var CurrentUserId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
if (ModelState.IsValid)
{
var newMessage = new Message();
newMessage.UserId = CurrentUserId;
newMessage.ContactId = model.ContactId;
newMessage.Body = model.MessageBody;
newMessage.Date = DateTime.Now;
newMessage.isDelivered = true;
_messageService.AddMessage(newMessage);
AtSmsSender smsSender = new AtSmsSender();
message = model.MessageBody;
phoneNumber = model.PhoneNr;
smsSender.SendSms(phoneNumber, message);
return RedirectToAction("Index", "Messenger");
}
else
{
return RedirectToAction("Index", "Messenger");
}
}
Почему бы просто не использовать ссылку?
@Model.PhoneNr = contactNumber; вроде не то. Обратите внимание, что значение PhoneNr отображается на стороне сервера.
@StephenMuecke, потому что никому не нравится, когда вся страница перезагружается, когда вы просто отправляете сообщение в чате?
@ vasily.sib, я согласен, но посмотрите код OP - у них есть RedirectToAction(), что означает, что они хотят перенаправить :)
Конечно, у OP также есть бессмысленный if (ModelState.IsValid) - он никогда не будет недействительным), так что кто знает, что они хотят делать
@ vasily.sib RedirectToAction только на время, потому что теперь мое приложение находится в тихом сырье, и я сделаю много рефакторинга, также все еще не знаю, как сделать перезагрузку <div>, которая не будет перезагружать всю страницу
@ DanielŽeimo, как я уже сказал: вам нужно прочитать об AJAX. Вкратце: ваш JavaScript отправляет запрос на сервер, получает новые данные и обновляет HTML-элементы прямо в вашем браузере.
@ vasily.sib ага, прочитаю об этом сейчас



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вы можете выполнить вызов ajax из функции get_contact_number. Что-то вроде приведенного ниже кода
$.ajax({
type:'GET',
url: '@Url.Action("ActionName", "ControllerName")',
async:true,
success:function(response){
//Do Something With response object returned by your action
}
});
если вы используете jQuery и правильно установите его в свое приложение
вам нужно прочитать о запросах AJAX