Помощник по пользовательскому тегу: как использовать сложные объекты в атрибутах?

В настоящее время я работаю над помощником по пользовательскому тегу ASP.NET Core. Мне нужно прочитать сложный объект из атрибута следующим образом:

[Модели]

public class Page {
  [HtmlAttributeName(page-size)]
  public int size {get; set;}
}

public class MyControl {
  public Page page {get; set;}
}

[класс TagHelper]

[TargetElement("MyControl", Attributes="page-size")]
public class MyControlTagHelper : TagHelper {
  public Page page {get; set;}
  //Here i have process methods.
}

И теперь я хочу получить значение размера страницы в представлении следующим образом:

<MyControl page-size="4"></MyControl>

Я не знаю, чтобы сделать это. До сих пор я пытался предоставить полный сложный объект атрибуту как показано в этой статье.

Как я могу прочитать значения сложного объекта как page-size?


person Madhu    schedule 06.07.2015    source источник


Ответы (2)


Удалите HtmlAttributeName из класса Page

public class Page {
  public int size{ get;set; }
 }

вам не нужен класс MyControl

поместите HtmlAttributeName в PageProperty вашего taghelper

[TargetElement("MyControl", Attributes="page-info")]
public class MyControlTagHelper : TagHelper {

  [HtmlAttributeName("page-info")]
  public Page page{ get;set; }
 //Here i have process methods.
 }

в вашем представлении поместите разметку для вашего пользовательского тега и передайте объект страницы из вашей модели просмотра

<MyControl page-info="@Model.Page"></MyControl>

теперь вы передаете объект Page непосредственно в атрибуте page-info и можете получить доступ к его членам непосредственно из метода процесса. Проверьте его на нуль внутри метода процесса, и если он равен нулю, просто установите output.SuppressOutput(); возврат;

person Joe Audette    schedule 06.07.2015
comment
Спасибо за ответ. Но я хочу получить значения для каждого свойства в сложном объекте по отдельности. Является ли это возможным? - person Madhu; 07.07.2015
comment
если вы хотите их по отдельности, вам следует создать свойства для каждого параметра в taghelper и передать их по отдельности как атрибуты в вашем представлении. Насколько мне известно, вы можете передать сложный объект или несколько простых примитивных типов, но вы не можете передать сложный объект и волшебным образом сопоставить его с отдельными примитивами. Кажется, намного чище просто передать сложный объект, а затем получить доступ к его свойствам по отдельности, например page.size и т.д. - person Joe Audette; 07.07.2015
comment
Он работает для передачи сложного объекта в помощник тегов (asp net core 2), этот ответ должен быть помечен как принятый. - person Evilripper; 07.03.2018

Ваш вспомогательный класс тега должен быть следующим:

[TargetElement("MyControl", Attributes="page-info")]
public class MyControlTagHelper : TagHelper {

  [HtmlAttributeName("page-info")]
  public Page page {get; set;}
  //Here i have process methods.

}

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

<MyControl page-info="new Page{size = 2}"></MyControl>

Для дальнейшего справки:

person Alan Sangeeth S    schedule 08.07.2015