ASP.net MVC发布int数组

本文关键字:int 数组 发布 MVC net ASP | 更新日期: 2023-09-27 18:21:25

想象一下这个公式。(我编辑了表格,以显示我正在努力做什么。)

@using (Html.BeginForm("Add", "Notify", FormMethod.Post ))
{
   @foreach (KeyValuePair<Server, Services[]> server in ViewBag.ServerServices)
                        {
                            <div class="panel panel-default">
                                <div class="panel-heading" role="tab" id="heading_@server.Key.ServerID">
                                    <h4 class="panel-title">
                                        <a role="button" data-toggle="collapse" data-parent="#accordion" href="#@server.Key.ServerID" aria-expanded="false" aria-controls="@server.Key.ServerID">
                                            @server.Key.Servername
                                        </a>
                                    </h4>
                                </div>
                                <div id="@server.Key.ServerID" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading_@server.Key.ServerID">
                                    @foreach (Services service in server.Value)
                                    {
                                        <input class="form-control" type="checkbox" name="selectedServerServices[@server.Key.ServerID]" value="@service.ServiceID"/><label>@service.ServiceName</label>
                                        <br/>
                                    }
                                </div>
                            </div>
                        }

我也想得到发布的值和密钥,但在尝试检索两者时,我总是得到一个null对象。

在Request.AllKeys中,我可以看到有两个值(例如)但是公布的值没有进入定义的字典

我的Action方法如下所示。

    public ActionResult Add(Dictionary<string, int> test )

ASP.net MVC发布int数组

我试图解决你的问题并找到一种方法。你只需要给你的复选框命名,如下所示:

<input class="form-control" type="checkbox" name="test.selectedServerServices[@server.Key.ServerID]" value="@service.ServiceID"/><label>@service.ServiceName</label>

您只能添加参数名称.yourCustomName

这是我的示例代码:

<div> 
    @using(Html.BeginForm()){
        <input type="checkbox" name="checks.First" value="1" />
        <input type="checkbox" name="checks.Second" value="2" />
        <input type="checkbox" name="checks.Third" value="3" />
        <input type="checkbox" name="checks.Fourth" value="4" />
        <input type="submit" value="Submit"/>
    }
</div>

这是我的行动:

[HttpPost]
public ActionResult Index(Dictionary<string, int> checks)
{
       return View();
}

这就像你想要的一样。但请注意,如果你在不选中任何复选框的情况下提交表格,你将在字典中有两个参数:控制器动作

或者您可以使用自定义模型活页夹,如下所示:

using System.Web.Mvc;
namespace YourNameSpace
{
    public class MyCustomModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request;
            Dictionary<string, int> test = new Dictionary<string, int>();
            test.Add("test[10]", int.Parse(request.Form["test[10]"]));
            test.Add("test[11]", int.Parse(request.Form["test[11]"]));
            return test;
        }
    }
}

然后在Global.asax 中注册

protected void Application_Start()
{
   AreaRegistration.RegisterAllAreas();
   RouteConfig.RegisterRoutes(RouteTable.Routes);
   ModelBinders.Binders.Add(typeof(Dictionary<string,int>), new MyCustomModelBinder());
}

最后在你的方法中使用它,如下所示:

public ActionResult Add([ModelBinder(typeof(MyCustomModelBinder))]Dictionary<string, int> test )