最近在给学校的公众号写微信墙,用户即将上墙的消息控制台页面中,ActionLink()发挥了很大的作用。他不仅仅可以充当一个跳转的链接,还可以用来调用自己或其他控制器的方法。
学MVC不久,以为要在页面上实现一个方法需要一个类似于“Submit”的按钮才能实现某个方法,但是在创建一个List视图之后,这个视图自动生成的默认代码中的ActionList那一行引起了我的注意。我们在运行生成的View页面时,可以看到List表单的每一行都会有个 Edit | Details | Delete,
我想这三个应该是对每一行的list的一个操作,也就是说这个Link点击之后也可以实现某个方法然后对这一行的数据进行修改删除等操作。系统默认生成的代码如下:
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
然后我们直接去查下LinkAction的使用方法。一共五种参数方法。
Html.ActionLink("linkText","actionName")
Html.ActionLink("linkText","actionName","controlName")
Html.ActionLik("linkText","actionName",routeValues)
Html.ActionLink("linkText","actionName",routeValues,htmlAttributes)
Html.ActionLink("linkText","actionName","controlName",routeValues,htmlAttributes)
其中linkText就是你要显示的Link名字,actionName是方法名,ControlName是控制器名,routeValues是用来传值给填好的控制器的方法的,HTMLAttribute是设置这个link的样式。
我们简单来看一下实际使用的时候怎么用。
如果不需要传值,只是简单的页面跳转:
<p>
@Html.ActionLink("待审核", "Index", "Console") |
@Html.ActionLink("已上墙", "Index", "Accept") |
@Html.ActionLink("未通过", "Index", "Refuse")
</p>
Ps.代码中的“ | ”可以让几个link区分的开一些,更好看而已。
如果需要传值,就把要传的值写在new{…}里面,如下:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.OpenID)
</td>
<td>
@Html.DisplayFor(modelItem => item.NickName)
</td>
<td>
@Html.ActionLink("上墙", "flag1", new { openid=item.OpenID,message=item.Message }) |
@Html.ActionLink("屏蔽", "flag2", new { openid = item.OpenID, message = item.Message })
</td>
</tr>
}
这里的item.OpenID就是传给view页面的list的每一项,可以看到之前有个:
foreach (var item in Model)
如果不写控制器名,就会默认调用自己的控制器下的“flag1”的方法,而我的flag1方法有三个参数,就正好能接收到new{…}里传过来的三个参数。
以下是我的flag1方法的声明:
public ActionResult flag1(string openid, string message, string sendtime)
点击Link后,就会调用控制器的flag1方法,参数按照new{…}中的对应传递,是不是很神奇~
如果想调用别的控制器的方法那就填写别的控制器名:
注意,需要同时填控制器名和Value传值的时候,一定是用第五种参数形式,即 Html.ActionLink(“linkText”,”actionName”,”controlName”,routeValues,htmlAttributes)
像这样,最后一个htmlAttributes填NULL就行了
@Html.ActionLink("屏蔽", "flag2", "Refuse", new {...},null)
这样就会调用RefuseController控制器下的flag1(…)方法。而一般调用的方法都会有一个return,这个return可以用来决定你这个link的功能实现后是刷新当前页面还是打开其他控制器的某个方法的页面。
如果要刷新当前的页面,可以用return RedirectToAction("Index");
,Index是当前页面的“Index”方法。
如果想跳转到其他页面,可以用return RedirectToAction("Index","Console");
这是返回Console控制器的“Index”方法。
如果跳转其他方法的时候想传递参数,那么跟LinkAction的传递参数方法类似,也是在new{…}里面加临时变量来传递。
RedirectToAction("Index", new { UserName = model.username });
我想RedirectToAction也还有很多类似的方法可以用在Return的地方,有兴趣的可以继续百度学习一下。