【问题标题】:MVC 5 AJax.Beginform Routevalues are generated wronglyMVC 5 AJax.Beginform Routevalues 生成错误
【发布时间】:2016-10-13 09:05:05
【问题描述】:

我正在尝试发布当前查询字符串以执行操作。所以我创建了以下扩展方法:

public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null)
        {
            var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary();
            if (col == null) return values;
            foreach (string key in col)
            {
                //values passed in object are already in collection
                if (!values.ContainsKey(key)) values[key] = col[key];
            }
            return values;
        }

在我看来,我使用的 routvalues 如下:

 using (Ajax.BeginForm(actionName: "Post", routeValues:Request.QueryString.ToRouteValues(), controllerName: "Request", ajaxOptions: new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter }, htmlAttributes: new { @data_toggle = "validator" }))
        {
        }

但奇怪的是,当生成 html 标记时,表单标记操作没有实际的查询字符串值,而是具有对象元数据的字符串版本。

<form action="/Request/Post?Count=5&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" data-ajax="true" data-ajax-method="Post" data-ajax-mode="after" data-ajax-success="SuccessCallBack" data-ajax-update="#successDiv" data-toggle="validator" id="form0" method="post" novalidate="true">

【问题讨论】:

  • 我认为Ajax.BeginForm中的控制器名称应该在动作名称之后,然后,第三个参数可以是路由值。
  • 我也尝试过这种方式,动作、控制器、路由值等仍然是相同的结果

标签: ajax asp.net-mvc routes ajax.beginform


【解决方案1】:

这对我有用:

@using (Ajax.BeginForm(
    actionName: "AddOns",
    controllerName: "Basket",
    routeValues: Request.QueryString.ToRouteValues(),
    ajaxOptions: new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter },
    htmlAttributes: new Dictionary<string, object> { { "class", "mainForm" } }))
{
    @:Blah
}

它输出:

<form action="/Basket/AddOns?test=test" class="mainForm" data-ajax="true" data-ajax-method="Post" data-ajax-mode="after" data-ajax-success="SuccessCallBack" data-ajax-update="#successDiv" id="form0" method="post">
    Blah
</form>

请注意最后一个参数是Dictionary&lt;string, object&gt;

使用此帖子作为来源:MVC3 Html.BeginForm - passing arguments as RouteValueDictionary fails

【讨论】:

    【解决方案2】:

    问题是您使用命名参数并且有Ajax.BeginForm() 的重载同时接受object routeValuesRouteValueDictionary routeValues

    在您的情况下,它使用object routeValues 并为RouteValueDictionaryCountKeys 等)的每个属性生成路由值。我假设这是因为首先定义了 object routeValues 的重载(但尚未找到任何记录该行为的内容)

    您可以通过省略名称并使用来解决此问题

    @using (Ajax.BeginForm("Post", "Request", Request.QueryString.ToRouteValues(), new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter }, new { @data_toggle = "validator" }))
    {
    }
    

    【讨论】:

    • 通过删除命名参数尝试了这个,但仍然是同样的问题
    • 为我工作 :)
    • 可能是此代码之外的任何内容。就像我记得这曾经为我工作过。它突然停止工作。
    • 想不出什么。稍后我将对其进行更多测试,看看是什么导致它使用object 而不是RouteValueDictionary 的重载。.NET 和 MVC 的哪个版本?同时,您可以尝试显式转换(使用Request.QueryString.ToRouteValues() as RouteValueDictionary
    • 哦,该死的——我很懒,在做测试时就忽略了这个属性。当我使用添加的参数再次测试它时,你的权利确实生成为object 而不是RouteValueDictionary :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多