.NET前后台传值后使结果显示在同一个界面的方法

代码清单1:更新后的Index方法 - MoviesController.cs

public ActionResult Index(string searchString)
{
    var movies = from m in db.Movies
                 select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    return View(movies);
}

Index 方法的第一行代码创建了一个 LINQ 查询,用来选择符合条件的电影:

代码清单2:选择电影的LINQ查询

var movies = from m in db.Movies
             select m;

这个查询虽然在这里定义出来,但并没有在数据库中执行。

如果 searchString 参数包含一个字符串(不是空字符串),movies 查询将会添加一个查询字符串的过滤条件,代码如下:

代码清单3:添加查询过滤条件

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.Contains(searchString));
}

代码清单3中的 s => s.Title 是一个 Lambda 表达式,Lambda 表达式被用在基于方法的LINQ查询中(上面代码中的 Where 方法),当做参数来使用。LINQ 语句在定义或修改的时候不会执行,相反的,查询会延迟执行,这意味着一个赋值语句直到迭代完成或调用 ToList 方法才具备真正的值。在上面的示例中,查询语句在 Index.cshtml 视图中执行。

现在,你可以修改Index 视图,让他展示一个表单给用户输入。

运行应用程序,并导航到 /Movies/Index ,在URL后面添加一个查询,例如 ?searchString=中国,被过滤的电影内容如下:

图1:查询到的电影数据

如果你把 Index 方法的参数名改为 id,那么 id 参数将会匹配 App_Start\RouteConfig.cs 文件中的默认路由中的{id}

{controller}/{action}/{id}

修改后的Index方法如下:

代码清单4:修改后的 Index 方法

public ActionResult Index(string id)
{
    string searchString = id;

    var movies = from m in db.Movies
                 select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    return View(movies);
}

修改以后,我们可以通过路由数据来传递查询字符串:

图2:使用URL片段进行查找

然而,你不能指望用户每次都通过修改URL来查找电影,因此你需要在界面上帮助他们过滤数据。如果你刚刚使用代码清单4中的代码测试了路由绑定是如何传递ID参数,现在再把它改回来,原始的代码可参考代码清单1。

打开Views\Movies\Index.cshtml  文件,在@Html.ActionLink("Create New", "Create") 后面添加如下代码:

代码清单5:修改Index.cshtml

<p>
    @Html.ActionLink("Create New", "Create")

@using (Html.BeginForm()) { <p> Title: @Html.TextBox("SearchString") <br /> <input type="submit" value="Filter" /> </p

>
    }

</p>

Html.BeginForm 帮助方法创建一个 <form>  标签。通过单击“Filter”按钮将表单提交给当前的页面。

运行应用程序,然后试着查找一个电影:

图3:在界面中过滤数据

我们可以为 Index 方法添加 HttpPost 的重载,这样一来,程序将会调用 HttpPost 修饰的 Index 方法,相应的代码和截图如下:

代码清单6:HttpPost 版的 Index 方法

[HttpPost]
public string Index(FormCollection fc, string searchString)
{
    return "<h3> From [HttpPost]Index: " + searchString + "</h3>";
}

图4:调用了 HttpPost 版本的 Index 方法

然而,尽管我们添加了HttpPost版的Index方法,它在实现的时候仍然存在一些局限性。设想你想将一个比较详细的查询添加书签,或者你想将查询结果以链接形式发送给朋友,注意观察HTTP POST 请求的时候,URL是没有改变的(仍然是 localhost:xxxxx/Movies/Index),这个地址本身不包含查询信息。现在,查询信息是作为表单数据发送到服务器的,这意味着你不能抓取到URL中的查询信息,将URL作为书签或发送给朋友。

解决方案就是重写 BeginForm 语句,使它发送一个GET请求,从而调用HttpGet版本的Index方法,修改后的代码如下:

代码清单7:使用GET请求的BeginForm方法

@using (Html.BeginForm("Index", "Movies", FormMethod.Get))

图5:使用GET请求的BeginForm参数描述

现在你再点击“Filter”按钮进行查找,查找的参数将包含在URL中,然后调用HttpGet 版的 Index 方法:

图6:URL中包含了查询参数

之所以想到用这个方法,是因为这个方法可以实现将查询结果页面和原始查询输入页面实现在同一个页面中显示,实现这个预期功能之后,即使用户因为网速或其他问题导致查询结果页面暂时无法显示,也不会出现空页面状态,可以充分照顾用户心情。

一开始我自己按照上述讲解编写代码时,只是纯粹地将他的前后台代码复制粘贴了过来,却没有考虑到我的前台是使用foreach来显示后台数据,查找的语句也是编写在foreach里,将源代码复制后,导致整个格局混乱,且所编写的代码含参数很多,不可能每个函数一一声明,若按照借鉴的源代码根本不能实现,后来经过再次检查理解源代码,在微信的代码中删掉了一些改进后不需要的参数,原文中提到将Post方法删掉,我个人的代码因为Index中还有很多从后台传值到前台的功能,所以保留了Post,附上我后台的代码

[HttpPost]
        public ActionResult Index5()//查询某一门成绩
        {
            string subjecname = Request.Form["SearchString"];
            string xuehao = string.Empty;

}

前台如果现实的数据很多的话相信大家都会使用foreach,由于个人觉得Post虽然有瑕疵但更方便,所以我依然沿用了Post方法,即将原文中的最后一个参数改为FormMethod.Post,附上前台代码。

@using (Html.BeginForm("Index5", "Wechat", FormMethod.Post))

{     <p>         课程名称: @Html.TextBox("SearchString")<br />

<input type="submit" value="查询" />     </p>

}

然后如愿以偿实现了将输入数据页面和查询结果页面在同一个页面中实现的功能,附图

时间: 2025-01-05 20:12:12

.NET前后台传值后使结果显示在同一个界面的方法的相关文章

Wampserver或者帝国CMS安装后, 打开localhost显示IIS欢迎界面图片

我们在安装集成环境Wampserver或者帝国CMS之后,有时会遇到一个问题, 打开localhost显示一张IIS欢迎界面图片,这个问题该如何解决呢,我在这里简单整理了一下解决方法 电脑win10系统,左下角点  开始>运行   输入cmd,进入如下图界面   然后输入以下命令:net stop iisadminnet stop w3svc   回到桌面,鼠标放到"计算机",左击,点"管理">"服务"   在服务里边找到以下项:Wo

服务器-Windows 2003 R2-取消多用户登录-多个用户登录显示不同的界面解决方法

1.服务器桌面中,打开“运行”窗口.(方法为:Win+R) 2.在“运行”中输入“gpedit.msc”,打开组策略编辑器. 3.在“计算机配置”中,依次点击“管理模板”-“Windows组件”-“终端服务”. 4.如上图,进行以下配置. (1)限制终端服务用户到一个远程会话,设置为“已启用”. (2)限制连接数量,设置为“未配置”. (3)允许用户使用终端服务远程连接,设置为“已启用”. 5.以上三项配置好后,可以通过多台电脑进行远程桌面测试,看是否会将已登录用户踢掉. 原文地址:https:

解决echart在IE中使用时,在div中添加postion后图表不显示问题

<!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px;width:1200px;z-index:1;position:absolute;"></div> echart在IE中使用时,在div中添加postion后图表不显示.主要问题是echart在编译后给div增加了filter,使div隐藏起来了,如图: 修改办法的话,当然就是删除啦,一是找到e

jquery中使元素显示和隐藏方法之间的区别

在实际的项目开发中,要使一个元素隐藏的方法有很多,比如css的多种属性和jquery的多种方法,虽然他们的作用都是使元素不可见,但是各个方法实现的原理是不一样的.下面主要介绍jquery各个元素隐藏方法之间的区别. 1.show()和hide() 使用hide()方法隐藏元素实际上是同时减少元素的高度.宽度以及不透明度,直到这三个属性为0,最后设置元素的css属性disolay:none.show()方法从上到下增大元素的高度,从左到右增大元素的宽度,同时增加内容的不透明度,直至元素完全显示.

配置github——每次提交后使contributions有记录(有小绿格子)

# 配置github--每次提交后使contributions有记录(有小绿格子) 这几天都有将自己的代码提交到github上,但是在profile里的contributions的表格中没有我提交的记录,看到下面有蓝色的连接 Learn how we count contributions. 点击后可以查看,但是感觉太麻烦了.就直接去网上找了一篇文章,具体操作如下: 1. 先查看自己的邮箱是否和github上绑定的邮箱一致否? * 查看到操作: * 先在本地进行git bash,然后输入git

Atom快速进入全屏后隐藏/恢复显示菜单栏

今天用ATOM进入全屏模式,然后偶尔琢磨这个Atom 1.3.2版本的软件的时候, 在菜单栏里面的View里面, 有一个Toggle Menu Bar的选项,好奇的我点击了下,瞬间,菜单栏就不见了.. 经过一番琢磨,终于想到了方法,其实就是通过键盘的快捷键啦. 注:虽然我用的是atom 1.3.2版本的软件,但是原理是一样的.工具/原料 Atom软件,键盘,鼠标,电脑 方法/步骤 首先,当然是打开ATOM软件啦,进入全屏怎么进?按下键盘上面的快捷键F11是最好的. Atom快速进入全屏后隐藏/恢

hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径.(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点,设u到直径上的一点为x,同理易证. 最后 缩

wdcp后台创建网站后,总是显示403界面

后台创建站点后后,域名已解析,但无法打开默认页面,创建网站后会有一个默认的index.html 存在于public_html下面的,我用FTP 查看是有的,但用域名却无法访问,总是显示403界面 经查看,发现端口管理下面的 80端口显示的是nginx.conf ,然后我将系统设置里面的web引擎修改为nginx后 可以了,不知道 这是不是bug.默认的环境是nginx+apache的 wdcp后台创建网站后,总是显示403界面,布布扣,bubuko.com

Ubuntu Kylin 14.04LTS 开机后卡在登陆界面,可以进入字符界面,或者登陆后鼠标不显示但是管用

2014年4月27日,距离中期检查还有七天,基本上什么也没做,特别着急,雨已经下了快一天了,中午用美团外卖定的黄焖排骨,MD,什么玩意,那么一点点就18块钱,一看就不值五块钱,发誓再也不吃,最重要的是订完两个半小时才送到,饿过劲了都 吐槽一下Ubuntu 的谷歌输入法,真是不符合国人习惯 刚刚整好这个毛病,有种致之死地而后生的狂喜 ubuntu今天上午关机去win7,买了个东西回来就没法开机了,开机后卡在登陆界面,鼠标不能动,好不容易鼠标能动了,也能输入密码了,结果进去之后又卡住了,不显示桌面,