我正在尝试学习
Asp.net mvc.我知道它与形式的不同,我需要改变我的思维方式.我的问题是关于webgrid.当我将webgrid添加到我的页面并点击搜索按钮与Post发送它渲染表与寻呼机等等.但是寻呼机上的链接不是发布形式,而是链接,我丢失了所有表单的数据.
控制器有两个索引方法,一个是get和另一个用于post.为了让我什么也不做,我只需要创建一个新的viewmodel,在这种情况下,Search类并设置它来查看.对于我的帖子方法,我抓住我的视图模型做搜索并设置填充的viewmodel来查看.
问题:webgrid将寻呼机渲染为链接,因此它将进入索引获取,但由于它不是发布请求,我没有填写任何表单字段,我的搜索将不提供相同的结果集.
可能示例代码可以更好地解释它.
视图:
<form action="" method="post"> Esas no : @Html.TextBoxFor(x=>x.Name) Yil : @Html.TextBoxFor(x=>x.Year) <input type="submit" value="Search" /> <hr /> @ViewBag.Message <hr /> @{ var grid = new WebGrid(Model.Results,rowsPerPage:5);} @grid.GetHtml(tableStyle:"table",htmlAttributes:new {id="tbl"} ) </form>
这是我的控制器:搜索发生在索引Post方法,它只有我的viewmodel类.
private ISearchContext _sc; public MyController(ISearchContext sc) { _dc = dc; } // // GET: /Dava/ public ActionResult Index() { var search = new Search(); ViewBag.Message = ""; return View(search); } [HttpPost] public ActionResult Index(Search search) { Search sres = _dc.SearchFromRepository(search); ViewBag.Message = String.Format("Count:{0} ",sres.Results.Count); return View(sres); }
搜索模型类如下:
public class Search { public int Year { get; set; } public string Name { get; set; } public IList<Item> Results { get; set; } public Search() { Results = new List<Item>(); } }
解决方法
解决此问题的一种方法是使用javascript并订阅任何寻呼机链接的点击事件,然后获取所需页面的值,将其注入到表单上的隐藏字段中,并将表单提交到服务器,以便另外两个值也被发送.
因此,首先在搜索视图模型上添加一个页面可空整数属性,并将相应的隐藏字段添加到将包含所选页码的表单中:
@Html.HiddenFor(x => x.Page,new { id = "page" })
那么所有你需要的是一个小的JavaScript片段到页面中订阅寻呼机链接的.click事件:
$(function () { $('tfoot a').click(function () { // when the user clicks on any of the pager links // try to extract the page number from the link and // set the value of the hidden field var page = this.href.match(/page=([0-9])+/)[1]; $('#page').val(page); // submit the form so that the POST action is invoked // passing along the search criteria (Name and Year) along // with the page hidden field value to the Index action $('form').submit(); // cancel the default action of the link which is to simply redirect // to the Index action using a GET verb. return false; }); });