【问题标题】:mvc3 Problem passing data from View to Controllermvc3 将数据从视图传递到控制器的问题
【发布时间】:2011-11-23 01:22:08
【问题描述】:

我正在使用 mvcContrib 生成一个网格,以允许用户通过键入搜索数据来过滤数据。在我的索引视图中呈现了几个部分视图:

这是处理搜索的局部视图:

@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>
}    

在索引视图的底部,我在 Html.BeginForm 中使用 Formmethod.Post 提交了另一个。

调用此视图的 Index ActionResult 传递一个带有搜索条件的视图模型和一个 mvcContrib 使用的 IQueryable 对象。

当用户按下“导出到 Excel”按钮时,我想将选定的值传递回 Index actionresult HttpPost 控制器。 (FromDate、ToDate 和 SearchWord)

FromDate、ToDate 和 SearchWord 值总是返回 null。

我是 MVC 的新手,所以欢迎任何有建设性的 cmets。

谢谢

【问题讨论】:

  • 你看不到 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 足够了......

标签: c# asp.net-mvc-3 controller


【解决方案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 方法。
【解决方案2】:

因为它们不在您发布的表格中 - (导出到 Excel 是单独的表格)。 输入

FromDate、ToDate 和 SearchWord

是第一种形式(在局部视图中)。所以这些值不会显示在控制器中(因为它们不是 http 帖子的一部分)。 如果你想看到所有这些值都被传递回控制器,它们应该在一个

Html.BeginForm

【讨论】:

  • 谢谢,但数据在模型中,如 Model.FromDate、Model.ToDate 和 Model.SearchWord。什么是正确的解决方案?
  • 看起来您在任何地方都使用相同的模型。尝试从部分视图中完全删除开始表单,并在 using beginform 语句中从

    标记封装整个索引视图。这是您可以做到这一点的方法之一。

  • 我将@using (Html.BeginForm("Index", "Home", FormMethod.Post 添加到SearchBox 部分视图中,但值仍然返回null。
  • 但是页面上还有 2 个 FORM。你在第二个点击提交,你的输入变量在第一个。因此,第二个表单正在回发到控制器,其中只有一个提交按钮。
  • 哦,现在说得通了,我想我正在尝试使用与 get 和 post 相同的视图。我确实看到了一篇关于根据值或名称响应不同提交的帖子。我可以试试这个,除非有更好的方法?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多