在我们的MVC3项目中,我们使用Spark视图引擎。我们已经建立了一个binding .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表单,将允许我们这个功能?例如:我们可以这样声明ajax表单:
<AjaxForm controller="Account" action="Create" ajax-UpdateTargetId="mydiv"></AjaxForm>
或者
<AjaxForm controller="Account" action="Create" ajax-OnComplete="handleSuccess"></AjaxForm>
绑定:
<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参数添加自己的重载。
唯一需要注意的是,你可以使用@*通配符初始化器设置的选项必须是字符串类型的
所以我假设你已经尝试过这个,它还没有为你工作?
<element name="AjaxForm">
<start># using(Ajax.BeginForm(@action, @controller, new AjaxOptions { UpdateTargetId = @ajax-UpdateTargetId }) ) {</start>
<end># }</end>
</element>
然后对于不同的用例——你只需要添加上面从最具体到最不具体的的重载,绑定就会根据你提供的属性选择正确的一个。
让我知道对这个答案的评论,如果它没有工作,然后我会扔一个快速的例子在一起,让它编译,我可以给你一个保证的解决方案-这都只是我的头。
我不记得这在我之前尝试的时候有一点棘手,除了AntiForgeryToken
部分,但我倾向于不再使用Ajax帮助程序,而是使用jQuery进行JSON调用。但是如果你愿意的话,没有理由不能把它用作绑定。
让我知道…
罗伯·G