2011-07-10 4 views
0

У меня есть несколько десятков HTML-форм, которые мне нужно преобразовать в частичные представления ASP.NET MVC Razor (CSHTML). В частности, мне нужно преобразовать каждый в @ Html.TextBox. Например, конвертироватьЛучший способ конвертировать HTML в CSHTML

<input name="text1" style="margin:0pt"></input> 

в

@Html.TextBox("text1", String.Empty, new { style = "margin:0pt" }) 

, а затем сохранить файл в новый файл CSHTML. Конечно, входной тег может быть закодирован как

<input .../> or as <input ...></input> 

и тег может иметь или не иметь атрибут стиля.

Кто-нибудь знает о автоматизированном способе, которым я мог бы это сделать? Альтернативой является внесение изменений вручную, что будет довольно трудоемким. Я думал, что магия регулярного выражения - это способ пойти или, возможно, использовать какой-то HTML-парсер DOM, но я не являюсь богатым Regex, и я не знаком с компонентами разбора, которые могли бы помочь.

Любые предложения были бы высоко оценены!

+1

Почему вы думаете, что элементы формы должны быть преобразованы вообще? – Guffa

+0

Что сказал @Guffa, есть ли у вас необходимость их конвертировать? Вы можете использовать их как есть. – rkaregaran

+0

Да, их нужно преобразовать, потому что я буду выполнять автоматическое заполнение значений на стороне сервера. – goombaloon

ответ

0

Это поможет вам,

private static void ReplaceInputTagsWithHtmlTextBox(string filePath) 
    { 
     var input = System.IO.File.ReadAllText(filePath); 
     var keyValueRegex = new Regex("\\s*(?<key>[^=]*)=\\s*['\"](?<value>[^'\"]*)['\"]"); 
     var values = new List<string>(); 
     var regex = new Regex(@"<input (?<Attributes>[^>]*)>(</input>)?"); 
     var newContent = regex.Replace(input, m => 
     { 
      var keyValueDict = new Dictionary<string, string>(); 
      var allAttributes = m.Groups["Attributes"].Value; 
      keyValueRegex.Replace(m.Groups["Attributes"].Value, mm => 
      { 
       keyValueDict.Add(mm.Groups["key"].Value, mm.Groups["value"].Value); 
       return null; 
      }); 
      var keyValues = new StringBuilder(); 
      foreach (KeyValuePair<string, string> pair in keyValueDict) 
      { 
       if (!pair.Key.Equals("id", StringComparison.OrdinalIgnoreCase) && !pair.Key.Equals("name", StringComparison.OrdinalIgnoreCase) && !pair.Key.Equals("value", StringComparison.OrdinalIgnoreCase))//don't include id, name and value 
        keyValues.Append(pair.Key.Replace("class", "@class") + "= \"" + pair.Value + "\", "); 
      } 
      var keyValuesString = keyValues.ToString(); 
      if (keyValuesString.EndsWith(", ")) 
       keyValuesString = keyValuesString.Remove(keyValuesString.Length - 2, 2); 
      if (!keyValueDict.ContainsKey("name") || keyValueDict["name"] == null) 
       keyValueDict["name"] = ""; 
      if (!keyValueDict.ContainsKey("value") || keyValueDict["value"] == null) 
       keyValueDict["value"] = ""; 
      return String.Format("@Html.TextBox(\"{0}\", \"{1}\", new {{ {2} }})\n", keyValueDict["name"], keyValueDict["value"], keyValuesString); 
     }); 
     using (StreamWriter outfile =new StreamWriter(filePath)) 
     { 
      outfile.Write(newContent); 
     } 
    } 

Теперь Jus называют его использованием,

ReplaceInputTagsWithHtmlTextBox("Temp.cshtml"); 
Смежные вопросы