Мне нужно передать некоторую информацию из представления в контроллер.
В настоящее время я делаю что-то вроде следующего:
var url = '@Url.Action((object)@ViewBag.CompID, "Print", "DataRecords")' + '?location=' + model.Location + '&startDate=' + model.StartDateTime + '&endDate=' + model.EndDateTime;
window.location.href = url;
Я хотел скрыть местоположение, дату начала и дату окончания от отображения в URL-адресе браузера.
Я думал о создании модели, как показано ниже, и отправке модели в контроллер, но не знаю, как это сделать.
var model = {
Location: $('#Location :selected').val(),
StartDateTime: $("#StartDate").val(),
EndDateTime: $("#EndDate").val()
};
Обратите внимание, что в моем случае мне не нужно извлекать какие-либо данные, так как метод Print будет выполнять печать.
Я открыт для достижения этого, помимо использования
window.location.href
Как это можно сделать с помощью AJAX, поскольку мне не нужно возвращаться к представлению с какими-либо данными, поскольку действие метода печати будет печатать соответствующее представление.
Возможный дубликат как я могу вызвать веб-контроллер API из ajax
Вам, вероятно, потребуется уточнить - вы говорите, что вам не нужен view для возврата каких-либо данных, но на самом деле он вам нужен (чтобы клиент мог напечатать "что-то") - не имеет значения, Ajax это или стандартный GET /POST (по определению все они отправляют Request и получают несколько Response) — ваш текущий код делает то же самое (отправляет GET со строкой запроса, ожидая ответа).





Ты можешь это сделать.
Контроллер
public class HomeController : Controller
{
public ActionResult HideQueryString()
{
return View("Tut143");
}
public ActionResult Print(string location, string startDate, string endDate)
{
//print here
return RedirectToAction("HideQueryString");
}
public ActionResult Tut143()
{
return View();
}
Вид:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width=device-width" />
<title>Tut143</title>
<script src = "https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type = "text/javascript">
$(function () {
$("#theButton").click(function () {
var model = {
Location: $('#Location :selected').val(),
StartDateTime: $("#StartDate").val(),
EndDateTime: $("#EndDate").val()
};
var url = '@Url.Action("Print", "Home")' + '?location=' + model.Location + '&startDate=' + model.StartDateTime + '&endDate=' + model.EndDateTime;
window.location.href = url;
})
})
</script>
</head>
<body>
<div>
<select id = "Location">
<option value = "Arizona">Arizona</option>
<option value = "California">California</option>
<option value = "Wyoming">Wyoming</option>
<option value = "Delaware">Delaware</option>
</select>
<input id = "StartDate" type = "text" value = "default startdate value" />
<input id = "EndDate" type = "text" value = "default enddate value" />
<input id = "theButton" type = "button" value = "Go" />
</div>
</body>
</html>
Если вы хотите передать данные от внешнего интерфейса к внутреннему контроллеру, у вас есть два способа:
MVC сделает привязку за вас, вся информация с помощью POST, например, должна быть внутри формы, затем на контроллере вы можете создать свою модель в качестве входных данных и использовать привязки MVC по умолчанию.
Мое предложение, если вы хотите скрыть эту информацию от URL-адреса, состоит в том, чтобы сделать это через сообщение (внутри формы с отправкой), но в любом случае, если вы нажмете на вкладку «Сеть» браузера в обоих случаях, вы должны увидеть параметры, которые вы переходя к вашему контроллеру.
Есть и другие способы добиться того же, что и при использовании словаря TempData, который хранит информацию для операции туда и обратно между контроллером и представлением, но я не рекомендую действовать таким образом каждый раз, когда использую его как лазейку. чтобы исправить мои проблемы, я чувствую себя виноватым
Вы должны использовать AJAX.