2015-08-15 154 views
2

我有一個名爲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操作時,搜索參數沒有任何價值。我錯過了什麼?

+0

你只是不通過任何東西。你的'SearchBoard'方法應該是一個'search'參數? –

+0

正如我寫的,搜索參數應該是IEnumerable 和BMModel是我的應用程序中的一個模型。我只需要將此對象的集合傳遞給CreateBoard Action。 – Hooman

回答

0

您不能將對象的集合傳遞給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表的部分視圖,以避免每次都需要刷新整個頁面。

0

你的控制器的動作僅僅是類的方法,所以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) 

我只是不從那裏你喜歡對子級讓你的模型理解。但希望你明白這個主意。

0

相反的Response.Redirect的,你可以嘗試

回報this.view( 「CreateBoard」,Q);

這可能工作

相關問題