ASP.Net MVC中Ajax.BeginForm在Razor视图中如何传递C#参数OnComplete

3

我在MVC C# Razor视图中有以下代码:

@{string url = "/Projects/_MonthRangesScriptsPartial";}
@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
    HttpMethod = "POST", 
    UpdateTargetId = "MonthRanges", 
    InsertionMode = InsertionMode.Replace,
    OnComplete = "updategraphArrayScript(@url,@ViewBag.InputResourceID)"
  }))

代码几乎完美运行,但我想在OnComplete行中将c#变量解析为它们的值。

也就是说,Razor引擎应该将代码解析为(例如):

<form action="/Projects/_MonthRanges/55" 
  data-ajax="true" data-ajax-complete="updategraphArrayScript(/Projects/assets,55)"
  ...>

不是:

<form action="/Projects/_MonthRanges/55" 
  data-ajax="true" data-ajax-complete="updategraphArrayScript(@url,@ViewBag.InputResourceID)"
  ...>
2个回答

3

只需创建另一个字符串变量:

@{
    string url = "/Projects/_MonthRangesScriptsPartial";
    string onComplete = String.Format("updategraphArrayScript({0}, {1})", url, ViewBag.InputResourceID);
}

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
    HttpMethod = "POST", 
    UpdateTargetId = "MonthRanges", 
    InsertionMode = InsertionMode.Replace,
    OnComplete = @onComplete
  }))

太棒了,而且非常优雅。谢谢! - Chopo87
很抱歉不得不取消接受该解决方案:由于URL是字符串,我必须在引号内传递它 string url = "\'/Projects/_MonthRangesScriptsPartial\'"; 我可以转义引号,使String.Format不会将其替换为 &#39; ,但是 Ajax.BeginForm 决定仍然用 &#39 替换它们。双倍和三倍转义似乎都没有用 - 有什么想法? - Chopo87
但是如果您像我的代码中所示的那样通过引号传递 onComplete,这应该可以工作... - Samuel Caillerie
如果我将其放在引号之间,最终会得到data-ajax-complete="@onComplete"。然而,我认为这实际上是一个关于Razor如何处理引号的单独问题,因此我将在新问题中发布。 - Chopo87

0

在分配OnComplete值时,请去掉@符号。由于您已经处于服务器端代码的上下文中,因此不需要它。

@用于将HTML呈现上下文切换到服务器端代码,<text></text>用于从服务器端上下文切换到HTML呈现。在上面给出的示例中,您已经处于BeginForm()方法的服务器端代码上下文中,因此不需要@。您不需要将onComplete的值写入页面,BeginForm()会处理所有这些。


谢谢提供信息。然而,即使没有使用@符号,我仍然得到了&#39 - Chopo87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接