使用ajax表单进行ASP.NET MVC Beta升级

时间:2009-01-02 11:04:41

标签: ajax asp.net-mvc

我在ASP.NET MVC beta应用程序中得到了这个ajax表单:

    <%using (this.Ajax.BeginForm("Edit", "Subscriber",
new AjaxOptions { OnSuccess = "onEditResult", HttpMethod = "GET" }))  
            {%>
                   <%=Html.Hidden("idSub", p.Id.ToString())%>
                     <input type="submit" value="Edit"/><% 
             } %>

我的控制器方法:

[AcceptVerbs(HttpVerbs.Get)]
        public JsonResult Edit(String idSub)
        { (...)
}

但是idSub总是为null,在升级到测试版之前我发誓我觉得这个方法有效!

我按照建议升级了JS文件(Microsoft Ajax)和程序集。

2 个答案:

答案 0 :(得分:0)

我发现这段代码有效(用POST动词代替GET,并使用formcollection作为控制器方法的参数)

    using (this.Ajax.BeginForm("BeginEdit", "Subscriber", 
new AjaxOptions { OnSuccess = "onEditResult", HttpMethod = "POST" }))  
    {%>
         <%=Html.Hidden("idSub", p.Id.ToString())%>
         <input type="submit" value="Edit"/><% 
    }


 [AcceptVerbs(HttpVerbs.Post)]
 public JsonResult BeginEdit(FormCollection form)
 {
    String idSub = form["idSub"];
 }

答案 1 :(得分:0)

我收到了错误,它来自Spring集成。在ControllerBase类中,IValueProvider的getter(从路径data / querystring / form获取值的类)返回_valueProvider,如下所示:

get {
    if (_valueProvider == null && ControllerContext != null) {
         _valueProvider = new DefaultValueProvider(ControllerContext);
    }
    return _valueProvider;
}

由于我的控制器是由Spring工厂从MVCContrib项目构建的,因此它被配置为单例,因此ValueProvider具有来自第一个请求而不是当前请求的ControllerContext属性值。

所以DefaultValueProvider类中的这一行:

HttpRequestBase request = ControllerContext.HttpContext.Request;

总是返回第一个Request对象,它没有QueryString,因此我的方法没有参数值。

我更改Spring配置以获取Controller的新实例,我认为这是一件好事,现在方法参数已正确填充。