视图中按钮与后台程序中的action之间的对应关系分为以下几种:
1、 视图中只有一个submit按钮
这类情况,比如注册、登录等视图。
在注册视图Register.cshtml中定义:
<input type="submit"id="register-button" class="button-1register-next-step-button" value="@T("Account.Register.Button")"name="register-button" />
只有这么一个submit按钮。
在CustomerController.cs中定义了两个函数,分别为:
[NopHttpsRequirement(SslRequirement.Yes)]
public ActionResult Register()
{
}
[HttpPost]
[CaptchaValidator]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model, stringreturnUrl, bool captchaValid)
{
}
第一个函数对应着视图Register.cshtml;第二个函数对应按下submit按钮之后的处理函数。
像这类情况,一般是两个函数同名,第一个函数不带参数,其对应视图,并给model的成员赋值;第二个函数必须带有[HttpPost],然后对获取到的model中的值进行处理。
2、 视图中有多个submit按钮
我最近在程序中用到了多个submit按钮的视图,将它们定义为:
<input type="submit" name="handle-one"class="t-button" value="@T("处理一")"/>
<input type="submit" name="handle-two"class="t-button" value="@T("处理二")"/>
后台cs文件中定义了下面几个函数:
public ActionResult OrdersHandleList()
{
}
[HttpPost, ActionName("OrdersHandleList")]
[FormValueRequired("handle-one")]
public ActionResult OrdersHandleOne(OrderHandleModel model)
{
}
[HttpPost, ActionName("OrdersHandleList")]
[FormValueRequired("handle-two")]
public ActionResult OrdersHandleTwo(OrderHandleModel model)
{
}
第一个函数对应着视图OrdersHandleList.cshtml;第二个函数对应按下submit handle-one按钮之后的处理函数,第三个函数对应按下submit handle-two按钮之后的处理函数。
像这类情况,几个函数名都可以不同,第一个函数不带参数,其对应视图,并给model的成员赋值;第二个函数必须带有[HttpPost, ActionName("OrdersHandleList")],其中OrdersHandleList表示其所处的视图所对应的action,[FormValueRequired("handle-one")]中描述的是该函数所对应的submit按钮的名称。第三个函数与第二个类似。
3、 使用Html.Telerik().Grid的视图
使用Html.Telerik().Grid的视图一般都分为两部分,上面是一些查询条件和一个查询按钮,下面是一个grid。这种视图中,一般都会使用到grid的Select命令,会给该命令赋一个给grid绑定数据的函数。
如果需要在每一条记录行后面显示“编辑”和“删除”,则需要添加Edit和Delete命令。在Columns中添加下面的语句:
columns.Command(commands=>
{
commands.Edit().Text(T("Admin.Common.Edit").Text);
commands.Delete().Text(T("Admin.Common.Delete").Text);
}).Width(180);
这样的话,就需要给Update(Edit包括update和cancel,cancel不需要绑定任何函数)和Delete命令绑定函数。
一般通过下面的语句进行绑定:
.DataBinding(dataBinding=>
{
dataBinding.Ajax()
.Select("OrdersList", "Order")
.Update("OrdersUpdate", "Order")
.Delete("OrdersDelete", "Order");
})
关于视图中这部分完整的code如下:
<table class="adminContent">
<tr>
<td>
@(Html.Telerik().Grid<OrderPaymentModel>()
.Name("orders-grid")
.ClientEvents(events=> events
.OnDataBinding("onDataBinding")
.OnDataBound("onDataBound"))
.DataKeys(x =>
{
x.Add(y =>y.Id).RouteKey("Id");
})
.DataBinding(dataBinding =>
{
dataBinding.Ajax()
.Select("OrdersList", "Order")
.Update("OrdersUpdate", "Order")
.Delete("OrdersDelete", "Order");
})
.Columns(columns =>
{
columns.Bound(x=> x.Id)
.ClientTemplate("<input type='checkbox' name='checkedRecords' value='<#= Id#>' class='checkboxGroups'/>")
.Title("<input id='mastercheckbox' type='checkbox'/>")
.Width(50)
.HtmlAttributes(new{ style = "text-align:center" })
.HeaderHtmlAttributes(new{ style = "text-align:center" });
columns.Bound(x=> x.Id);
columns.Bound(x=> x.Email);
columns.Bound(x=> x.StartDateTimeUtc);
columns.Bound(x=> x.EndDateTimeUtc);
columns.Bound(x=> x.CurrentAmount);
columns.Bound(x=> x.TotalAmount);
columns.Command(commands=>
{
commands.Edit().Text(T("Admin.Common.Edit").Text);
commands.Delete().Text(T("Admin.Common.Delete").Text);
}).Width(180);
})
.Pageable(settings=> settings.PageSize(gridPageSize).Position(GridPagerPosition.Both))
.EnableCustomBinding(true))
</td>
</tr>
</table>
在cs文件中,我们有如下几个函数:
public ActionResult OrdersList()
{
}
[GridAction(EnableCustomBinding = true)]
public ActionResult OrdersList (GridCommand command,OrderModel model)
{
}
[GridAction(EnableCustomBinding = true)]
public ActionResult OrderUpdate(GridCommand command,OrderModel model)
{
}
[GridAction(EnableCustomBinding = true)]
public ActionResult OrderDelete(GridCommand command,OrderModel model)
{
}
第一个函数对应着视图OrdersList.cshtml;第二个函数负责为grid绑定数据;第三个函数是点击Update按钮时执行;第四个函数是点击Delete按钮时执行。后三个函数必须带着[GridAction(EnableCustomBinding = true)],与视图中的.EnableCustomBinding( true)对应;另外,它们的参数都是(GridCommand command, OrderModel model)。