2014-01-06 2 views
2

Как я должен написать это, чтобы Бритва не ускользает все биты и качается:Мой HTML Helper в настоящее время narlified от Razor

вспомогательный класс (по иронии судьбы не то, что полезно)

public static class TableHeaderSortingHelpers 
{ 
    public static string SortTableClickEvent(this HtmlHelper html, string url, string column) 
    { 
     string sortingPropertiesObject; 
     sortingPropertiesObject = "var properties = new James.prototype.Table.SortingProperties();"; 
     sortingPropertiesObject += "properties.url = '" + url + "';"; 
     sortingPropertiesObject += "properties.colName = '" + column + "';"; 
     sortingPropertiesObject += "onclick = 'James.Table.SortByColumn(properties, this);'"; 

     return sortingPropertiesObject ; 
    } 
} 

вид Razor

<table class="table table-striped"> 
    <tr> 
     <th width="100%" @Html.SortTableClickEvent(@Request.Path, "Name");> 
      Name 
     </th> 

После компиляции выглядит следующим образом:

<th width="100%" this);&#39;;="" &#39;name&#39;;onclick="'James.Table.SortByColumn(properties," =="" james.prototype.table.sortingproperties();properties.url="'/Site/List';properties.colName" properties="new" var=""> 
       Name 
      </th> 

EDIT //////////////////////

Если я пытаюсь вернуть MVCHtmlString я получаю следующее:

public static class TableHeaderSortingHelpers 
{ 
    public static MvcHtmlString SortTableClickEvent(this HtmlHelper html, string url, string column) 
    { 
     string sortingPropertiesObject; 
     sortingPropertiesObject = "var properties = new James.prototype.Table.SortingProperties();"; 
     sortingPropertiesObject += "properties.url = '" + url.ToString() + "';"; 
     sortingPropertiesObject += "properties.colName = '" + column + "';"; 
     sortingPropertiesObject += "onclick = 'James.Table.SortByColumn(properties, this);'"; 

     MvcHtmlString returnString = new MvcHtmlString(sortingPropertiesObject); 

     return returnString; 
    } 
} 

Выход

<th width="100%" ;="" ;onclick="James.Table.SortByColumn(properties, this);" ;properties.colname="Name" james.prototype.table.sortingproperties();properties.url="/Site/List" properties="new" var=""> 
       Name 
      </th> 
+2

Можете ли вы опубликовать пример своего ожидаемого результата? Причина, по которой я спрашиваю, заключается в том, что 'var properties = ...' будет заканчиваться непосредственно в тэге 'th'. –

ответ

4

Попробуйте вернуть MvcHtmlString или HtmlString, которые должны предотвратить механизм выхода бритвы

public static IHtmlString SortTableClickEvent(this HtmlHelper html, string url, string column) 
{ 
    string sortingPropertiesObject; 
    sortingPropertiesObject = "var properties = new James.prototype.Table.SortingProperties();"; 
    sortingPropertiesObject += "properties.url = '" + url + "';"; 
    sortingPropertiesObject += "properties.colName = '" + column + "';"; 
    sortingPropertiesObject += "onclick = 'James.Table.SortByColumn(properties, this);'"; 

    return new HtmlString(sortingPropertiesObject); 
} 

Update:

может быть, вместо того, чтобы пытаться создать экземпляр свойства объекта (который не будет работать рядный, если вы не ставите все в одной строке). Просто используйте обычный объект json и вызовите ваш метод. Helper может выглядеть следующим образом, например:

public static IHtmlString SortTableClickEvent(this HtmlHelper html, string url, string column) 
{ 
    string sortingPropertiesObject = string.Format(
     "onclick = \"James.Table.SortByColumn({{ url:'{0}', column:'{1}' }}, this);\"" 
     , url, column); 

    return new HtmlString(sortingPropertiesObject); 
} 

Или, если вы хотите, чтобы ваши собственные свойства объекта в JavaScript, просто положить все в одну линию, как я сказал, и правильно бежать все так, что метод OnClick хорошо отформатирован и не нарушает вашу html-разметку ...

+0

Можете ли вы проверить мой ОП снова, я добавил немного. Ваш пример дал ошибку компиляции: Ошибка Невозможно неявно преобразовать тип 'string' в 'System.Web.HtmlString' – Jimmyt1988

+0

Это еще один вопрос, пожалуйста, удалите свое редактирование, отметьте это как ответ и добавьте еще один вопрос. Помимо этого. Вы пытаетесь поместить все в встроенную ручку onclick.Это очень плохая практика в любом случае, и я вообще этого не делал – MichaC

+0

Это не другой вопрос брах ... Ваше предложение, к сожалению, не работает ... И то, что я сделал, это не плохая практика. Я буквально объявлял новые свойства, чтобы помещать в один класс, который я вызываю onclick. Мне нужен отдельный объект свойств для каждого вызова .. учитывая, что это для заголовков таблиц. – Jimmyt1988

1

Я согласен с MichaC в том, что это плохая практика, что вы пытаетесь сделать. Я предлагаю это, где вы сохраняете логику внутри представления.

HTML-:

<th width="100%" class="sort-table" data-column="Name"> 
    Name 
</th> 

И JavaScript, это должно быть внутри вида.

<script type="text/javascript"> 
$(function() { 
    $('.sort-table').click(function() {    
     // Get the value from the data-column attribute. 
     var column = $(this).data('column'); 

     // Create object and set properties. 
     var properties = new James.prototype.Table.SortingProperties(); 
     properties.url = '@Request.Path'; 
     properties.colName = column; 

     // Sort the table. 
     James.Table.SortByColumn(properties, this); 
    }); 
}); 
</script> 

Однако, я не уверен, что click событие может быть связан с <th> элементом.

+0

Спасибо за помощь чувак. очень ценен – Jimmyt1988

Смежные вопросы