如何在HTML.ActionLink中获取一个或多个复选框的值?

时间:2011-03-16 22:56:49

标签: c# sql asp.net-mvc model-view-controller

我有两个html.actionlinks:

<%= 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();
        }

2 个答案:

答案 0 :(得分:1)

复选框通常与HTML表单一起使用,而不是动作链接。因此,将它们放在表单中并使用提交按钮,该按钮将自动将检查的值发送到相应的控制器操作。如果你想使用链接,你需要编写将订阅链接的click事件的javascript代码,提取复选框的值,修改此链接指向的URL,以便将这些值附加到查询字符串中恕我直言对于这么简单的事情来说,这太过分了。当然,您可以在单个HTML <form>中拥有多个具有不同名称的提交按钮,并且在相应的控制器操作中,您将能够获取被单击的按钮的名称,以便您可以执行不同的操作。

此外,我强烈建议您使用HTTP POST或PUT动词来修改服务器上的状态。


更新:

根据评论部分的要求,我提供了一个例子。

与往常一样,您要从模型开始:

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>

答案 1 :(得分:0)

也许我已经超出范围了。但是我已经通过以下(肮脏的)方式使用两个ASCII字符来可视化我的两个状态,从而解决了“使用ActionLink模拟复选框行为”的问题:

Index.cshtml:

@Html.ActionLink($"{(HomeController.IsExpertMode ? "☑️" : "⬜")}Expert-Mode", "ToggleExpertMode", "Home")

HomeController.cs:

public class HomeController : Controller
{
    ...

    public bool IsExpertMode { get; private set; }

    public ActionResult ToggleExpertMode()
    {
      IsExpertMode = !IsExpertMode;
      return RedirectToAction("Index");
    }

    ...
}

希望这可以帮助某人寻找该问题的简单解决方案-也使我也出现在此页面上...