2013-10-11 6 views
1

Я создал динамичную форму для ввода пары ключ-значение, некоторые значения будут содержать запятые:Получать значения, разделенные запятой из формы?

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 или у вас есть идея, как я могу его решить?

+1

Почему бы вам не использовать какую-либо модель как параметр вместо FormCollection –

+0

Этот вид Razor не будет работать. Вы не можете использовать такое сложное выражение Lambda в строго типизированном помощнике, например TextBoxFor: 'm => m.GetParameters(). ElementAt (i) .Name'. Это вызовет исключение. Также вы не можете переопределить свойство 'name', как вы пытаетесь. Помощник всегда будет использовать выражение лямбда для вычисления представления. –

+0

Как я могу это достичь? – Mangs

ответ

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]; 
     } 
    } 

Надеется, что это помогает.

+0

Первая часть не является опцией, пользователь должен ввести имя и значение =/И я не вижу, как вторая поможет, я все равно получаю строки с разделителями-запятыми, и пользователю должно быть разрешено использовать запятые в значении , – Mangs

+0

Фактически оба "var value = formCollection [" value "+ i];" и "var name = formCollection [" name "+ i];" возвращает null (он циклически четыре раза возвращает null каждый раз) – Mangs

+0

Вместо html-хелпера для текстового поля попробуйте сырой синтаксис html, например '' вот так .. –

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) 
    { 
     ... 
    } 
Смежные вопросы