Member 14534451 Ответов: 2

Как передать значение нажатой ссылки в контроллер, отличный от строки запроса


Всем Привет,
У меня есть ниже код, который загружает сетку, и один из столбцов в строке кликабелен, на котором он загружает другую страницу. Я хочу передать значение этой нажатой ссылки на следующую страницу. Я не хочу, чтобы это было через строку запроса. Я сделал это ниже, используя строку запроса, любая помощь, пожалуйста, используя любой другой способ

Что я уже пробовал:

---формат HTML -----
@foreach (DataColumn col в модели.ModelPageDataRow.Столбцы)
{
@формат HTML.ActionLink(строка[col.ColumnName].ToString(), "ActionName", new { PassedId = row[col.ColumnName] })
}

--контроллер ---

public ActionResult ActionName()
{
Сеанс["SomeId"] = Запрос.Файл Querystring["PassedId"];
---Остальная часть кода
}

2 Ответов

Рейтинг:
5

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 пытаться проверить форму при нажатии одной из этих кнопок. Если вы написали свои собственные сценарии проверки, вам нужно будет соответствующим образом их обновить.


Member 14534451

У меня уже есть форма, есть ли какой-то другой способ достичь этого?

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" к пуговицам.

Member 14534451

Спасибо. Это решение сработало :)

Рейтинг:
15

F-ES Sitecore

Попробуйте TempData

TempData in ASP.NET MVC[^]


Member 14534451

Я не думаю, что tempdata работает в моем сценарии