简体   繁体   English

将空列表从控制器传递到控制器ASP.NET MVC

[英]Passing empty list from controller to controller asp.net mvc

I Have a controller called CreateBoard that inserts the sessions and displays all of the sessions created in the database.My post version of this has no problem and is ok so I don't show it in the question. 我有一个名为CreateBoard的控制器,该控制器可以插入会话并显示数据库中创建的所有会话。我的发布版本没有问题并且可以,所以我不在问题中显示它。

[HttpGet]
public ActionResult CreateBoard(IEnumerable<BMModel> search)
{
    if (search != null)
    {
        ViewData["Boards"] = search;
        return View();
    }
    var db = new BoardMeetingEntities();
    var AllBoards = from p in db.tBoardMeetings
                    select new BMModel
                    {
                        Absent = p.Absent,
                        Attendent = p.Attendent,
                        BMDate = p.BMDate,
                        BMNo = p.BMNo.ToString(),
                        EndTime = p.EndTime,
                        StartTime = p.StartTime,
                        MPlace = p.MPlace,
                        IsFinal = p.IsFinal
                    };
    ViewData["Boards"] = AllBoards;
    return View();
}

public ActionResult SearchBoard(FormCollection form)
{
    string bmno = form["BMNo"].ToString();
    string bmdate = form["BMDate"].ToString();
    string mplace = form["MPlace"].ToString();
    if (bmno == string.Empty && bmdate == string.Empty && mplace == string.Empty)
    {
        return RedirectToAction("CreateBoard");
    }
    else
    {
        var db = new BoardMeetingEntities();
        var query = from p in db.tBoardMeetings
                    where p.BMNo.ToString() == bmno || p.BMDate.ToString() == bmdate || p.MPlace == mplace
                    select new BMModel
                    {
                        Absent = p.Absent,
                        Attendent = p.Attendent,
                        BMDate = p.BMDate,
                        BMNo = p.BMNo.ToString(),
                        EndTime = p.EndTime,
                        StartTime = p.StartTime,
                        MPlace = p.MPlace,
                        IsFinal = p.IsFinal
                    };
        IEnumerable<BMModel> q = query.ToList();
        return RedirectToAction("CreateBoard", new { search = q });
    }
}

And this is my view: 这是我的观点:

@model MetronicTemplate.Models.BMModel
@{
    ViewBag.Title = "BoardMeeting";
    IEnumerable<MetronicTemplate.Models.BMModel> list = ViewData["Boards"] as IEnumerable<MetronicTemplate.Models.BMModel>;
}


<div class="tab-content">
<div class="tab-pane active" id="tab_1">
    <div class="portlet box blue">
        <div class="portlet-title">
            <div class="caption"><i class="icon-reorder"></i> sessions</div>
            <div class="tools">
                <a href="javascript:;" class="collapse"></a>
                <a href="#portlet-config" data-toggle="modal" class="config"></a>
                <a href="javascript:;" class="reload"></a>
                <a href="javascript:;" class="remove"></a>
            </div>
        </div>
        <div class="portlet-body form">
            @using (Html.BeginForm())
            {


                if (ViewData["Success"] != null)
                {
                    <div class="alert alert-success fade in alert-dismissable" role="alert">
                        <p href="#" class="alert-link" data-dissmiss="alert">@ViewData["Success"].ToString()
                    </div>

                }
                @Html.ValidationSummary(true, "", new { @class = "alert-danger fade in alert-dismissable", role = "alert" })
                <h3 class="form-section">
                    insert session
                </h3>
                <div class="row-fluid">
                    <div class="span3 ">
                        <div class="control-group">
                            <label class="control-label">session number</label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.BMNo, "", new { @class = "m-wrap span12 medium", id ="BMNo" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.BMNo, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                    <div class="span6 ">
                        <div class="control-group">
                            <label class="control-label">date </label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.BMDate, "", new { @class = "m-wrap span12 medium", id ="BMDate" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.BMDate, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                </div>
                <div class="row-fluid">
                    <div class="span3 ">
                        <div class="control-group">
                            <label class="control-label">start session</label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.StartTime, "", new { @class = "m-wrap span12 medium", id ="BMStart" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.StartTime, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                    <div class="span3 ">
                        <div class="control-group">
                            <label class="control-label">end of session </label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.EndTime, "", new { @class = "m-wrap span12 medium", id ="BMEnd" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.EndTime, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                    <div class="span3 ">
                        <div class="control-group">
                            <label class="control-label">place of session </label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.MPlace, "", new { @class = "m-wrap span12", id ="BMPlace" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.MPlace, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                </div>

                <div class="row-fluid">
                    <div class="span6 ">
                        <div class="control-group">
                            <label class="control-label">attendent</label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.Attendent, "", new { @class = "m-wrap span12", id ="BMPresent" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.Attendent, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                    <div class="span6 ">
                        <div class="control-group">
                            <label class="control-label">absent </label>
                            <div class="controls">
                                @Html.TextBoxFor(m => m.Absent, "", new { @class = "m-wrap span12", id ="BMAbsent" })
                            </div>
                            <div class="controls text-error">
                                @Html.ValidationMessageFor(m => m.Absent, "", new { @class = "m-wrap span12" })
                            </div>
                        </div>
                    </div>
                </div>

                <div class="form-actions">
                    <button type="submit" class="btn blue"><i class="icon-ok"></i> insert</button>
                    <button type="button" class="btn" onclick="cancel()">cancel</button>
                    <button type="submit" class="btn" formaction="@Url.Action("SearchBoard","BoardMeeting")">search</button>
                </div>


                if (list != null)
                {
                    <h3>the list</h3>
                    <table class="table table-striped table-hover table-bordered dataTable" id="sample_editable_1" aria-describedby="sample_editable_1_info" style="width:1000px;">

                        <thead>
                            <tr role="row">
                                <th class="sorting_disabled" role="columnheader" rowspan="1" colspan="1" style="width:5px;" aria-label="Username">sessoin no</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 15px;" aria-label="Full Name: activate to sort column ascending">session date</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 15px;" aria-label="Points: activate to sort column ascending"> session start</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 50px;" aria-label="Delete: activate to sort column ascending">end of session</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 75px;" aria-label="Edit: activate to sort column ascending">place of session</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 114px;" aria-label="Delete: activate to sort column ascending">attendent</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 114px;" aria-label="Delete: activate to sort column ascending">absent</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 114px;" aria-label="Delete: activate to sort column ascending">status</th>
                                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample_editable_1" rowspan="1" colspan="1" style="width: 50px;" aria-label="Delete: activate to sort column ascending"></th>
                            </tr>
                        </thead>
                        <tbody role="alert" aria-live="polite" aria-relevant="all">

                            @foreach (var item in list)
                            {
                                <tr class="odd">
                                    <td class="center">@item.BMNo.ToString()</td>
                                    <td class="center">@item.BMDate.ToString()</td>
                                    <td class="center">@item.MPlace</td>
                                    <td class="center">@item.StartTime</td>
                                    <td class="center">@item.EndTime</td>
                                    <td class="center">@item.Attendent</td>
                                    <td class="center">@item.Absent</td>
                                    <td class="center">
                                        <span class="center">
                                            <input class="checker" type="checkbox" readonly
                                                   @if (item.IsFinal) { @: checked
                                                                                                                                                                    } />
                                        </span>
                                    </td>

                                    <td class=" "><a class="center" href="@Url.Action("BMDetail", "BoardMeeting", new { id = @item.BMNo })">bmdetail</a></td>
                                    <td class=" "><a class="center" href="@Url.Action("Agenda", "BoardMeeting", new { id = @item.BMNo })">bmorder</a></td>
                                    <td class=" "><a class="center" href="@Url.Action("BMDetailActivity", "BoardMeeting", new { id = @item.BMNo, z = true })">session analyse</a></td>
                                    <td class=" "><a class="center" href="@Url.Action("FinalizeBoard", "BoardMeeting", new { FID = @item.BMNo })">finalize</a></td>
                                    <td class=" "><a class="edit" href="javascript:;">edit</a></td>
                                    <td class=" "><a class="delete" href="javascript:;">delete</a></td>
                                </tr>
                            }
                        </tbody>
                    </table>
                }
            }
        </div>
    </div>
</div>

My Problem is when I click the search button,it invokes the searchboard action and it queries the database perfectly but when it redirects to createboard action,the view displays nothing in the table.I traced the code and noticed that the query in the searchboard has no problem but when it comes to the createboard action,the search parameter has no value.Am I missing something? 我的问题是,当我单击搜索按钮时,它会调用搜索板操作并完美地查询数据库,但是当它重定向到创建板操作时,该视图在表中不显示任何内容。我跟踪了代码,并注意到搜索板中的查询具有没问题,但是当涉及到createboard动作时,搜索参数没有任何价值。我错过了什么吗?

Your controllers actions is just class methods, so insted of return RedirectToAction("CreateBoard"); 您的控制器操作只是类方法,因此要插入return RedirectToAction("CreateBoard"); you alway can write like this: 您总是可以这样写:

IEnumerable<BMModel> searchModel = new List<BMModel>();
searchModel.Add(new BMModel
{
 ... // Here you should init your model as you like
});
searchModel.Add(new BMModel
{
 ... // Here you should init your model as you like
});
//And so on
return CreateBoard(IEnumerable<BMModel> search)

I just don't understand from where you whould like to get your model. 我只是不知道您想从哪里获得模型。 But hope you get the idea. 但是希望您能明白。

Instead of response.redirect, can you try 您可以尝试代替response.redirect

return this.view("CreateBoard",q); 返回this.view(“ CreateBoard”,q);

this may work 这可能有效

You cannot pass a collection of objects to a GET method. 您不能将对象的集合传递给GET方法。 The RedirectToAction() method will use the .ToString() method of the object(s) your passing as route parameters to generate the query string. RedirectToAction()方法将使用传递的对象的.ToString()方法作为路由参数来生成查询字符串。 In your case, your object is List<BMModel> which means that it is passing search = "System.Collection.Generic.List<yourAssembly.BMModel>" which cannot be bound to your parameter. 在您的情况下,您的对象是List<BMModel> ,这意味着它正在传递无法绑定到参数的search = "System.Collection.Generic.List<yourAssembly.BMModel>" Fortunately this does not work because it it did it would easily exceed the query string limit and throw an exception. 幸运的是,这行不通,因为它确实可以轻松超过查询字符串限制并引发异常。

Remove the POST method and change the GET method to include the 3 parameters you want to post. 删除POST方法并更改GET方法以包含要发布的3个参数。

[HttpGet]
public ActionResult CreateBoard(int BMNo, DateTime BMDate, string MPlace)
{
  ViewData["Boards"] = // Generate and filter your query here based on the parameters
  return View()
}

and change the your form to FormMethod.Get 并将您的窗体更改为FormMethod.Get

@using (Html.BeginForm("CreateBoard", "yourControllerName", FormMethod.Get))
{
    ....
}

Note you view currently shows a number of controls which seem unrelated to you search query so it unclear what these are for. 请注意,您当前查看的视图显示了许多与您的搜索查询无关的控件,因此不清楚它们的用途。

I recommend you consider using ajax to post the values to a separate controller method that returns a partial view containing the html table to avoid need to refresh the whole page each time. 我建议您考虑使用ajax将值发布到单独的控制器方法中,该方法将返回包含html表的局部视图,以避免每次都刷新整个页面。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM