从表单中获取逗号分隔值?

时间:2013-10-11 09:27:25

标签: c# html asp.net asp.net-mvc

我为键值对输入创建了动态表单,某些值将包含逗号:

    using(Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "parameterForm" }))
    {
    <div id="inputBoxesDIV">
         for(int i = 0; i < Model.GetParameters().Count; i++)
           { 
                Html.TextBoxFor(m => m.GetParameters().ElementAt(i).Name, new { name = "name" + i, size = 20 })
                Html.TextBoxFor(m => m.GetParameters().ElementAt(i).Value, new { name = "Value" + i, size = 60 })
        }
    </div>
    }

我尝试使用FormCollection来获取这样的对:

    [HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {
        foreach (var key in formCollection.AllKeys)
        {
            var value = formCollection[key];
        }

        foreach (var key in formCollection.Keys)
        {
            var value = formCollection[key.ToString()];
        }
    //etc...

但是FormCollection使用逗号分隔的字符串,所以它没有用。

有什么方法我仍然可以使用FormCollection或者你知道我怎么解决它?

2 个答案:

答案 0 :(得分:0)

我认为你应该能够根据动态生成的模型生成一个视图,为此你不应该让你有机会对keyvalue对的名称部分进行更改,所以删除文本框就好了,

using(Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "parameterForm" }))
    {
    <div id="inputBoxesDIV">
         for(int i = 0; i < Model.GetParameters().Count; i++)
           { 
<label>Model.GetParameters().ElementAt(i).Name</label>

                Html.TextBoxFor(m => m.GetParameters().ElementAt(i).Value, new { name =Model.GetParameters().ElementAt(i).Name , size = 60 })
        }
    </div>
    }

因此用户将对值文本框进行更改,因此在他提交您的能够使用键名读取所有值后,

[HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {
        foreach (var key in formCollection.AllKeys)
        {
            var value = formCollection[key];
        }

        foreach (var key in formCollection.Keys)
        {
            var value = formCollection[key.ToString()];
        }
}

如果您想让用户能够修改键值对中的名称和值,那么您应该尝试这样做,

     using(Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "parameterForm" }))
        {
        <div id="inputBoxesDIV">
             for(int i = 0; i < Model.GetParameters().Count; i++)
               { 

<input type="text" name="@String.Format("name{0}",i)" value="@Model.GetParameters().ElementAt(i).Name" size="20"/>

                   <input type="text" name="@String.Format("value{0}",i)" value="@Model.GetParameters().ElementAt(i).Value" size="60"/>
            }
        </div>
        }

并在你的帖子中,

[HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {


        for(int i=0;i<formCollection.AllKeys.Length;i++)
        {
            var value = formCollection["value"+i];
            var name=formCollection["name"+i];
        }
    }

希望这有帮助。

答案 1 :(得分:0)

为什么不使用模型绑定:

public class KeyValue
{
    public string Name { get; set; }
    public string Value { get; set; }
}
public class Test
{
    public IEnumerable<KeyValue> KV { get; set; }
}

并且在视野中:

@using(Html.BeginForm())
{
    for (var kv = 0; kv < Model.KV.Count(); ++kv)
    {
        @Html.TextBox("KV[" + kv + "].Name", Model.KV.ElementAt(kv).Name);
        @:<br />
        @Html.TextBox("KV[" + kv + "].Value", Model.KV.ElementAt(kv).Value);
        @:<br />
    }

    @:<input type="submit" />
}

在cotroller中获取你的模型:

    [HttpPost]
    public ActionResult Index(Test model)
    {
        ...
    }