Как получить значение одного или нескольких флажков в HTML.ActionLink? - PullRequest
1 голос
/ 17 марта 2011

У меня есть две ссылки html.action:

<%= Html.ActionLink("Activate", "ActivateJob", "Management", new { selectedObject = Model.ID }, new { @class = "actions" })%>
            |
            <%= Html.ActionLink("Deactivate", "DeactivateJob", "Management", new { selectedObject = Model.ID }, new { @class = "actions" })%>

вот часть моей таблицы:

 foreach (WPM.Logic.Job item in this.Model.Jobs)
                    {
                        Model.ID = item.ID;
                %>
                <tr style="background-color: #FEF0D7">
                    <td style="border-bottom: solid 1px #f3ad44; width: 80px;" align="center">
                        <%= i = i + 1 %>
                    </td>
                    <td style="border-bottom: solid 1px #f3ad44; width: 120px;">
                        <input type="checkbox"  name="selectedObject" value="<%= Model.ID %>" />
                    </td>

в исходном коде страницы у меня есть следующие результаты:

 <td style="border-bottom: solid 1px #f3ad44; width: 120px;"> 
                        <input type="checkbox"  name="selectedObject" value="8cdc5c7a-72ba-4883-99b9-272c866c27a9" /> 
                    </td> 

<td style="border-bottom: solid 1px #f3ad44; width: 120px;"> 
                        <input type="checkbox"  name="selectedObject" value="fa6b304c-9eee-483f-8208-e2febd077e50" /> 
                    </td> 

вопрос: как получить эти два значения флажка в HTML.ActionLink selectedObject?Я получаю только последний результат в html.actionlinks, но мне нужно значение выбранного флажка.У меня их много.

это действие, которое будет вызвано из html.actionlink.

[HttpGet]
        public ActionResult ActivateJob(Guid[] selectedObject)
        {
            foreach (Guid guid in selectedObject)
            {

            }
            return View();
        }

        [HttpGet]
        public ActionResult DeactivateJobs(Guid[] selectedObject)
        {
            foreach (Guid guid in selectedObject)
            {

            }
            return View();
        }

1 Ответ

1 голос
/ 17 марта 2011

Флажки обычно идут вместе с формами HTML, а не ссылками действий. Поэтому поместите их в форму и используйте кнопку отправки, которая автоматически отправит проверенные значения в соответствующее действие контроллера. Если вы хотите использовать ссылки, вам нужно написать код JavaScript, который будет подписываться на событие нажатия ссылки, извлечь значения флажков, изменить URL-адрес, на который указывает эта ссылка, чтобы добавить эти значения в строку запроса, которая имхо это слишком большая работа для чего-то такого простого. Конечно, вы можете иметь несколько кнопок отправки с разными именами внутри одного HTML <form>, и в соответствующем действии контроллера вы сможете получить название кнопки, на которую вы нажали, чтобы вы могли выполнить другое действие.

Кроме того, я настоятельно рекомендую вам использовать глагол HTTP POST или PUT для чего-то, что изменяет состояние на сервере.


UPDATE:

В соответствии с просьбой в разделе комментариев я привожу пример.

Как всегда, вы начинаете с модели:

public class JobViewModel
{
    public string Guid { get; set; }
    public bool Selected { get; set; }
}

public class MyViewModel
{
    public IEnumerable<JobViewModel> Jobs { get; set; }
}

затем вы переходите на контроллер:

public class JobsController: Controller
{
    public ActionResult Edit()
    {
        var model = new MyViewModel
        {
            // Obviously those will be coming from some data store
            // and you could use AutoMapper to map your business entities
            // to the corresponding view model
            Jobs = new[]
            {
                new JobViewModel { ID = Guid.NewGuid() },
                new JobViewModel { ID = Guid.NewGuid() },
                new JobViewModel { ID = Guid.NewGuid() },
            }
        };
        return View(model);
    }

    [HttpPut]
    public ActionResult Update(MyViewModel model, string activate)
    {
        if (!string.IsNullOrEmpty(activate)) 
        {
            // the Activate button was clicked
        }
        else
        {
            // the Deactivate button was clicked
        }
        // TODO: model.Jobs will contain the checked values => 
        // do something with them like updating a data store or something

        // TODO: return some view or redirect to a success action
        return View("Edit", model);
    }
}

тогда у вас будет строго типизированное представление, в котором вы будете использовать шаблоны редактора:

<% using (Html.BeginForm("Update", "Jobs")) { %>
    <%= Html.HttpMethodOverride(HttpVerbs.Put) %>
    <table>
        <thead> 
            <tr>
                <th>Foo bar column ...</th>
            </tr>
        </thead>
        <tbody>
            <%= Html.EditorFor(x => x.Jobs) %>
        </tbody>
    </table>
    <input type="submit" value="Activate" name="activate" />
    <input type="submit" value="Dectivate" name="deactivate" />
<% } %>

и последняя часть будет соответствующим шаблоном редактора, который будет отображаться для каждого элемента в коллекции Jobs (~/Views/Jobs/EditorTemplates/JobViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.JobViewModel>" 
%>
<tr>
    <%= Html.HiddenFor(x => x.ID) %>
    <%= Html.CheckBoxFor(x => x.Selected) %>
</tr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...