返回数组显示为null

时间:2017-11-07 03:13:29

标签: c#

我的应用导航到类似下面的内容,我无法控制这个,因为这是从我正在处理插件的其他应用返回的。

http://myapp.com/MyController?url=myUrl.com&ids%5B%5D=6085620807&ids%5B%5D=6085620743

我试图让那些ID被推回到我的视图中。

p = p.copy(first = 3)

所有我得到的都是空ID,检索网址没问题。任何有关如何使这项工作的想法将不胜感激。

此致

3 个答案:

答案 0 :(得分:0)

你的控制器代码是正确的。

public string test(string[] ids)
    {
        string t = string.Empty;
        foreach(string s in ids)
        {
            t = t + s;
        }
        return t;
    }

您需要为模型绑定器传递数组的索引以识别它。 例如url www.example.com/test?ids[0]=yourfirstvalue将返回您的第一个值作为输出。

但如果您期望在ids数组中有更多项目,则应考虑绑定复杂对象。

请参阅haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx了解详情

答案 1 :(得分:0)

假设您有此网址:

http://myapp.com/MyController?url=myUrl.com&ids=6085620807&ids=6085620743

然后你需要绑定这个动作方法:

public ActionResult MyController(string url, string[] ids)
{
    // other stuff
    return View();
}

您可以使用从DefaultModelBinder继承的自定义模型binder类来获取字符串数组:

public class StringArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null || string.IsNullOrEmpty(value.AttemptedValue))
        {
            return null;
        }

        return value
            .AttemptedValue
            // use .Split() here if you want to split by particular character(s)
            .ToArray();
    }
}

之后,您可以将某个字符串数组的模型绑定器应用为参数:

public ActionResult MyController(string url, [ModelBinder(typeof(StringArrayModelBinder))] string[] ids)
{
    Response.Write("<input id='url' value='" + url + "'>");
    foreach (string id in ids)
    {
        Response.Write("<input id='orderIds[" + id + "]' value='" + id + "'>");
    }

    return View();
}

或者您可以通过在Application_Start方法中注册来全局应用自定义模型绑定器类:

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(string[]), new StringArrayModelBinder());
}

答案 2 :(得分:0)

您需要从网址中删除括号,删除控制器字(除非您在控制器名称中复制了控制器字),并包含以下操作:

http://myapp.com/My/test?url=myUrl.com&ids=6085620807&ids=6085620743

路由引擎将查找名为 My 的控制器加上 Controller 一词,然后找到带有2个参数的操作:一个名为 url的字符串和一个名为 ids 的整数数组。

以上网址将适用于此控制器和操作:

public class MyController{
public string test(string url, string[] ids){...}
}