为Ajax.BeginForm添加spark绑定

时间:2011-07-07 11:58:29

标签: asp.net-mvc-3 spark-view-engine

在我们的MVC3项目中,我们使用的是Spark视图引擎。我们已经设置了一个Bindings.xml文件,它有几个绑定,包括一个Html.BeginForm,如下所示:

<element name="Form">
    <start># using (Html.BeginForm("@action", "@controller", new RouteValueDictionary{{"@route-*"}}, FormMethod.@method, new Dictionary[[string,object]]{{"@*"}})) {</start>
    <end># }</end>
</element>

我们在视图中使用此内容如下:

<Form controller="Account" action="Create" method="Post">
....
</Form>

我们现在有几个案例我们想使用ajax表单,所以理想情况下,我们想添加一个新的绑定,以便我们可以使用

问题是Ajax.BeginForm接受AjaxOptions对象。此对象用于配置UpdateTargetId,成功/失败的方法和回调之类的内容。

在Razor中,我通常称之为:

@using(Ajax.BeginForm("Create", "Account", new AjaxOptions { UpdateTargetId = "mydiv" }) )

根据用例的不同,我们需要在AjaxOptions对象上配置不同的字段,而忽略其他字段。

有没有办法可以为ajax表单添加一个spark绑定,以便我们使用这个功能?例如:这样我们可以声明ajax形式如下:

<AjaxForm controller="Account" action="Create" ajax-UpdateTargetId="mydiv"></AjaxForm>

或在另一个例子中

<AjaxForm controller="Account" action="Create" ajax-OnComplete="handleSuccess"></AjaxForm>

2 个答案:

答案 0 :(得分:2)

这是绑定:

<element name="AjaxForm">
    <start># using (Ajax.BeginForm(new AjaxOptions{"@ajax-*"})) {</start>
    <end># }</end>
</element>

并在您的代码中使用它:

<AjaxForm ajax-UpdateTargetId="mydiv">
    Some form elements go here...
</AjaxForm>

根据Controller / Action参数的需要添加自己的重载。

唯一需要注意的是,您可以使用@ *通配符初始化程序设置的选项必须是字符串类型。

答案 1 :(得分:1)

所以我假设你已经尝试了这个并且它对你不起作用了吗?

<element name="AjaxForm">
    <start># using(Ajax.BeginForm(@action, @controller, new AjaxOptions { UpdateTargetId = @ajax-UpdateTargetId }) ) {</start>
    <end># }</end>
</element>

然后针对不同的用例 - 您只需从最具体到最不具体的添加上述排序的重载,Bindings将根据您提供的属性选择正确的一个。

让我知道对这个答案的评论,如果它没有奏效,那么我将一起快速举例并让它编译,我可以给你一个有保证的解决方案 - 这就是全部脱离我的头顶。

我不记得在我之前尝试过这一点时有点棘手,除了AntiForgeryToken部分,但是我倾向于不再使用Ajax助手来支持使用jQuery的JSON调用。但如果你愿意的话,没有理由不能将它用作绑定。

让我知道......
Rob G