Richard Deeming
Чтобы передать значения от клиента к серверу, у вас есть два варианта: сделать запрос GET и передать значение в строке запроса; или использовать <form>
чтобы сделать почтовый запрос.
@foreach (DataColumn col in Model.ModelPageDataRow.Columns)
{
using (Html.BeginForm("ActionName"))
{
@Html.Hidden("PassedId", row[col.ColumnName]);
<button type="submit">@row[col.ColumnName]</button>
}
}
Вы можете использовать CSS для стилизации кнопки, чтобы она выглядела как ссылка, если это необходимо.
NB: Формы не могут быть вложенными. Если у вас уже есть форма, обертывающая этот код, вам придется использовать строку запроса.
На стороне сервера, вместо того чтобы обращаться к
Request.QueryString
или
Request.Form
коллекции, просто используйте привязку модели для получения значения:
public ActionResult ActionName(string passedId)
{
Session["SomeId"] = passedId;
---Rest of the code
}
Редактировать: Альтернативный подход, если у вас уже есть форма, обертывающая код:
Сделайте так, чтобы кнопки отправляли родительскую форму с определенным именем и значением:
@foreach (DataColumn col in Model.ModelPageDataRow.Columns)
{
<button type="submit" name="SendThisIdToTheOtherAction" value="@row[col.ColumnName]" formnovalidate>@row[col.ColumnName]</button>
}
Обновите существующее действие, чтобы проверить, была ли нажата одна из кнопок. Если это так, сохраните значение в
TempData
и перенаправить на новое действие:
public ActionResult ActionThatYourFormPostsTo(string sendThisIdToTheOtherAction = null)
{
if (!string.IsNullOrEmpty(sendThisIdToTheOtherAction))
{
TempData["PassedId"] = sendThisIdToTheOtherAction;
return RedirectToAction("ActionName");
}
...
}
Обновите новое действие, чтобы прочитать значение из
TempData
:
public ActionResult ActionName()
{
string passedId = (TempData.TryGetValue("PassedId", out object id) ? Convert.ToString(id) : null;
...
}
NB: То
formnovalidate
атрибут на кнопке должен препятствовать плагину проверки jQuery пытаться проверить форму при нажатии одной из этих кнопок. Если вы написали свои собственные сценарии проверки, вам нужно будет соответствующим образом их обновить.
Richard Deeming
Как я уже сказал, формы не могут быть вложенными.
Ваш единственный другой вариант-изменить действие, которое публикует ваша текущая форма, чтобы вы могли опубликовать значение для этого, а затем использовать TempData
чтобы сохранить его, пока вы перенаправляетесь на другое действие:
@foreach (DataColumn col in Model.ModelPageDataRow.Columns)
{
<button type="submit" name="SendThisIdToTheOtherAction" value="@row[col.ColumnName]">@row[col.ColumnName]</button>
}
public ActionResult ActionThatYourFormPostsTo(string sendThisIdToTheOtherAction = null)
{
if (!string.IsNullOrEmpty(sendThisIdToTheOtherAction))
{
TempData["PassedId"] = sendThisIdToTheOtherAction;
return RedirectToAction("ActionName");
}
...
}
public ActionResult ActionName()
{
string passedId = (TempData.TryGetValue("PassedId", out object id) ? Convert.ToString(id) : null;
...
}
NB: Если у вас есть какая-либо проверка на вашей форме, это может помешать вам нажать кнопку. Если вы используете ненавязчивую проверку jQuery, вы можете обойти эту проблему, добавив
formnovalidate="formnovalidate"
к пуговицам.