将空列表从控制器传递到控制器asp.net mvc
我有一个名为CreateBoard的控制器,它插入会话并显示数据库中创建的所有会话。我发布的这个版本没有问题,没关系,在问题中显示它。将空列表从控制器传递到控制器asp.net mvc
[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 });
}
}
这是我的看法:
@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>
我的问题是,当我点击搜索按钮,它调用searchboard行动,它完美地查询数据库,但是当它重定向到createboard行动,该视图在表中没有显示任何内容。我追踪了代码,发现在搜索板中的查询没有问题,但是当涉及到createboard操作时,搜索参数没有任何价值。我错过了什么?
您不能将对象的集合传递给GET方法。 RedirectToAction()
方法将使用您传递的对象的.ToString()
方法作为路由参数来生成查询字符串。在你的情况下,你的对象是List<BMModel>
,这意味着它通过search = "System.Collection.Generic.List<yourAssembly.BMModel>"
,它不能绑定到你的参数。幸运的是,这不起作用,因为它很容易超出查询字符串限制并抛出异常。
删除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()
}
和表单更改为FormMethod.Get
@using (Html.BeginForm("CreateBoard", "yourControllerName", FormMethod.Get))
{
....
}
注意查看当前显示的一些控制这似乎无关,你搜索查询,因此目前还不清楚这些都是。
我建议您考虑使用ajax将值发布到单独的控制器方法,该方法返回包含html表的部分视图,以避免每次都需要刷新整个页面。
你的控制器的动作仅仅是类的方法,所以insted的回报RedirectToAction("CreateBoard");
你同可以这样写:
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)
我只是不从那里你喜欢对子级让你的模型理解。但希望你明白这个主意。
相反的Response.Redirect的,你可以尝试
回报this.view( “CreateBoard”,Q);
这可能工作
你只是不通过任何东西。你的'SearchBoard'方法应该是一个'search'参数? –
正如我写的,搜索参数应该是IEnumerable和BMModel是我的应用程序中的一个模型。我只需要将此对象的集合传递给CreateBoard Action。 –
Hooman