MVC3问题:从视图传递数据到控制器时出现问题

6
我将使用mvcContrib来生成一个网格,让用户可以通过输入搜索数据来过滤数据。在我的Index View中呈现了几个部分视图:
这是处理搜索的部分视图:
@model CRMNPS.Models.PagedViewModel<CRMNPS.Models.NPSProcessed>
@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{

    <label>
Model Number:&nbsp;&nbsp; @Html.TextBox("searchWord" )
<br /><br />From Date:&nbsp;&nbsp;&nbsp; @Html.EditorFor(m => m.FromDate)
</label>
<label>
<Br /><br />To Date:&nbsp;&nbsp;&nbsp; @Html.EditorFor(m => m.ToDate)
</label>    
<label>
<br /><br />&nbsp;&nbsp;<input class="button" value="Search" type="submit" />
<br />
</label>

}

这是我的索引视图:

@model PagedViewModel <CRMNPS.Models.NPSProcessed>

@{
    ViewBag.Title = "CRM Processed List";
    Layout = "~/Views/Shared/_Layout.cshtml";
}


<h2>Processed List</h2>
@{Html.RenderPartial("SearchBox");}
@{Html.RenderPartial("Pager", Model.PagedList);}
@Html.Grid(Model.PagedList).AutoGenerateColumns().Columns(column =>{
column.For(x => Html.ActionQueryLink(x.ModelNumber, "Edit", new { id = x.Id
})).Named("Id").InsertAt(1);
}).Sort(Model.GridSortOptions).Attributes(@class => "grid-style")

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { FromDate = Model.FromDate, ToDate = Model.ToDate, SearchWord = Model.SearchWord }))
{
   <p>
       <input class="button" value="Export to Excel" type="submit" />
   </p>
}    

在Index View的底部,我有一个在Html.BeginForm中的另一个submit,使用了Formmethod.Post。
调用此视图的Index ActionResult会传递一个包含搜索条件和mvcContrib使用的IQueryable对象的视图模型。
当用户按下导出到Excel按钮时,我希望将所选值传回Index actionresult HttpPost控制器。(FromDate,ToDate和SearchWord)
FromDate、ToDate和SearchWord的值始终为空。
我对MVC还比较新,欢迎任何建设性的评论。
谢谢
Joe

你现在很少看到 <br>&nbsp;&nbsp;&nbsp; 了... - Blindy
2个回答

4

由于它们不在您发布的表单中 - (导出到Excel在单独的表单中)。

输入

FromDate,ToDate和SearchWord

在第一个表单中(在部分视图中)。因此,这些值不会显示在控制器中(因为它们不是http post的一部分)。

如果您想查看所有这些值被传回控制器,则它们应该位于一个

Html.BeginForm


谢谢,但数据在Model中,如Model.FromDate、Model.ToDate和Model.SearchWord。什么是正确的解决方案? - Joe Pitz
看起来你在各处都使用了同一个模型。尝试完全从部分视图中删除begin form,并将整个索引视图从<h2>标签封装在using beginform语句中。这是你可以做到这一点的其中一种方式。 - MoXplod
我将@using (Html.BeginForm("Index", "Home", FormMethod.Post)添加到SearchBox部分视图中,但值仍然返回null。 - Joe Pitz
但是你在页面上仍然有两个FORM。而且你正在点击第二个提交按钮,你的输入变量在第一个表单中。所以第二个表单仅带有一个提交按钮回传给控制器。 - MoXplod
哦,现在有点明白了,我想我试图将同一视图用作get和post。我确实看到过关于根据值或名称响应不同提交的帖子。我可以尝试这样做,除非有更好的方法?谢谢。 - Joe Pitz
我建议在搜索时使用ajax post。并且对于导出到Excel命令,请使用表单提交。如果这解决了您的问题,请标记为答案。谢谢。 - MoXplod

1
一种方法是将它们全部放在同一个表单中,就像MoXplod建议的那样,或者您可以使用一些javascript通过钩住第二个表单的提交事件将搜索值作为查询字符串发送。
$('#excel-form').live('click', function(){
   var action = this.action;
   var searchString = $('#SearchWord').val();
   var toDateString = $('#ToDate').val();
   var fromDateString = $('#FromDate').val();
   if(action.indexOf('?')<0)
   {
      action = action+"?SearchWord="+searchString;
   }
   else
  {
     action = action+"&SearchWord="+searchString;
  }
  action = action + "&ToDate="+toDateString + "&FromDate=" + fromDateString;
  $(this).attr('action', action);
  return true;

});

它将把这些值放在查询字符串中,并使它们在操作方法中可用。或者,您可以使用Ajax将这些值发布到控制器,而不是完整的常规后退。


谢谢@Muhammad,如果我无法让这篇文章重新工作,我会尝试你推荐的ajax方法。 - Joe Pitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接