Эта проблема была решена в ASP.Net MVC 3. Теперь они автоматически преобразуют подчеркивания в свойствах атрибута html в тире. Им повезло в этом, так как подчеркивание недопустимо в атрибутах html, поэтому MVC может с уверенностью подразумевать, что вам понадобится тире при использовании подчеркивания.
Например:
@Html.TextBoxFor(vm => vm.City, new { data_bind = "foo" })
отобразит это в MVC 3:
<input data-bind="foo" id="City" name="City" type="text" value="" />
Если вы все еще используете старую версию MVC, вы можете имитировать, что делает MVC 3, создав этот статический метод, который я позаимствовал из исходного кода MVC3:
public class Foo {
public static RouteValueDictionary AnonymousObjectToHtmlAttributes(object htmlAttributes) {
RouteValueDictionary result = new RouteValueDictionary();
if (htmlAttributes != null) {
foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes)) {
result.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
}
}
return result;
}
}
И тогда вы можете использовать это так:
<%: Html.TextBoxFor(vm => vm.City, Foo.AnonymousObjectToHtmlAttributes(new { data_bind = "foo" })) %>
и это даст правильный атрибут data- *:
<input data-bind="foo" id="City" name="City" type="text" value="" />