Conteúdo da resposta
1) Como acessar os dados do modelo no bloco de código Javascript / Jquery no .cshtml
arquivo
2) Como acessar os dados do modelo no bloco de código Javascript / Jquery no .js
arquivo
Como acessar os dados do modelo no bloco de código Javascript / Jquery no .cshtml
arquivo
Existem dois tipos de Model
atribuições c # variable ( ) à variável JavaScript.
- Atribuição de propriedade - tipos de dados básicos, como
int
, string
, DateTime
(ex: Model.Name
)
- De atribuição de objetos - personalizado ou aulas embutido (ex:
Model
, Model.UserSettingsObj
)
Vamos analisar os detalhes dessas duas atribuições.
Para o restante da resposta, vamos considerar o AppUser
modelo abaixo como exemplo.
public class AppUser
{
public string Name { get; set; }
public bool IsAuthenticated { get; set; }
public DateTime LoginDateTime { get; set; }
public int Age { get; set; }
public string UserIconHTML { get; set; }
}
E os valores que atribuímos a este modelo são
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
Atribuição de propriedade
Vamos usar sintaxe diferente para atribuição e observar os resultados.
1) Sem agrupar a atribuição de propriedades entre aspas.
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
Como você pode ver, existem alguns erros, Raj
e True
são consideradas variáveis javascript e, como elas não existem, é um variable undefined
erro. Onde, quanto à variável dateTime, o erro é que os unexpected number
números não podem ter caracteres especiais, as tags HTML são convertidas em nomes de entidades para que o navegador não misture seus valores e a marcação HTML.
2) Atribuição de propriedades de agrupamento entre aspas.
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
Os resultados são válidos. Portanto, agrupar a atribuição de propriedade entre aspas nos dá uma sintaxe válida. Mas observe que o número Age
agora é uma string; portanto, se você não quiser, podemos apenas remover as aspas e elas serão renderizadas como um tipo de número.
3) Usando @Html.Raw
mas sem colocá-lo entre aspas
var Name = @Html.Raw(Model.Name);
var Age = @Html.Raw(Model.Age);
var LoginTime = @Html.Raw(Model.LoginDateTime);
var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
var IconHtml = @Html.Raw(Model.UserIconHTML);
Os resultados são semelhantes ao nosso caso de teste 1. No entanto, o uso @Html.Raw()
da HTML
string nos mostrou algumas mudanças. O HTML é mantido sem alterar os nomes de entidade.
Dos documentos Html.Raw ()
Envolve a marcação HTML em uma instância HtmlString para que seja interpretada como marcação HTML.
Mas ainda temos erros em outras linhas.
4) Usando @Html.Raw
e também envolvendo-o entre aspas
var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';
Os resultados são bons com todos os tipos. Mas nossos HTML
dados agora estão quebrados e isso quebrará os scripts. O problema é que estamos usando aspas simples '
para agrupar os dados e até os dados possuem aspas simples.
Podemos superar esse problema com duas abordagens.
1) use aspas duplas " "
para quebrar a parte HTML. Como os dados internos têm apenas aspas simples. (Certifique-se de que, após agrupar aspas duplas, também não haja "
dados)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) Escape do significado do caractere no código do lado do servidor. Gostar
UserIconHTML = "<i class=\"fa fa-users\"></i>"
Conclusão da cessão de propriedades
- Use aspas para dataType não numérico.
- Não use aspas para dataType numérico.
- Use
Html.Raw
para interpretar seus dados HTML como estão.
- Cuide dos seus dados HTML para escapar do significado das aspas no lado do servidor ou use uma cotação diferente da dos dados durante a atribuição à variável javascript.
Atribuição de objeto
Vamos usar sintaxe diferente para atribuição e observar os resultados.
1) Sem agrupar a atribuição do objeto entre aspas.
var userObj = @Model;
Quando você atribui um objeto ac # à variável javascript, o valor .ToString()
desse objeto será atribuído. Daí o resultado acima.
2 Empacotando a atribuição de objeto entre aspas
var userObj = '@Model';
3) Usando Html.Raw
sem aspas.
var userObj = @Html.Raw(Model);
4) Usando Html.Raw
junto com aspas
var userObj = '@Html.Raw(Model)';
Não Html.Raw
foi muito útil para nós ao atribuir um objeto à variável.
5) Usando Json.Encode()
sem aspas
var userObj = @Json.Encode(Model);
//result is like
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482572875150)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
Nós vemos algumas mudanças, vemos que nosso modelo está sendo interpretado como um objeto. Mas nós transformamos esses caracteres especiais entity names
. Também é inútil agrupar a sintaxe acima entre aspas. Simplesmente obtemos o mesmo resultado entre aspas.
Dos documentos de Json.Encode ()
Converte um objeto de dados em uma sequência que está no formato JavaScript Object Notation (JSON).
Como você já encontrou esse entity Name
problema com a atribuição de propriedades e, se você se lembra, nós o superamos com o uso de Html.Raw
. Então, vamos tentar isso. Vamos combinar Html.Raw
eJson.Encode
6) Usando Html.Raw
e Json.Encode
sem aspas.
var userObj = @Html.Raw(Json.Encode(Model));
Resultado é um objeto Javascript válido
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) Usando Html.Raw
e Json.Encode
entre aspas.
var userObj = '@Html.Raw(Json.Encode(Model))';
Como você vê, o agrupamento com aspas nos fornece dados JSON
Conslusão na atribuição de objetos
- Use
Html.Raw
e Json.Encode
em combinação para atribuir seu objeto à variável javascript como objeto JavaScript .
- Use
Html.Raw
e Json.Encode
envolva-o também quotes
para obter um JSON
Nota: Se você observou o formato de dados DataTime não está correto. Isso ocorre porque, como dito anteriormente, o Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
JSON não contém um date
tipo. Outras opções para corrigir isso são adicionar outra linha de código para manipular esse tipo sozinho usando o objeto javascipt Date ()
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
Como acessar os dados do modelo no bloco de código Javascript / Jquery no .js
arquivo
A sintaxe do Razor não tem significado no .js
arquivo e, portanto, não podemos usar diretamente nosso Modelo dentro de um .js
arquivo. No entanto, há uma solução alternativa.
1) A solução está usando variáveis globais javascript .
Temos que atribuir o valor a uma variável javascipt com escopo global e depois usá-la em todos os blocos de código dos seus arquivos .cshtml
e .js
. Portanto, a sintaxe seria
<script type="text/javascript">
var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>
Com isso, podemos usar as variáveis userObj
e userJsonObj
como e quando necessário.
Nota: Eu pessoalmente não sugiro o uso de variáveis globais, pois fica muito difícil para manutenção. No entanto, se você não tiver outra opção, poderá usá-la com uma convenção de nomenclatura adequada userAppDetails_global
.
2) Usando a função () ou closure
Quebra todo o código que depende dos dados do modelo em uma função. E, em seguida, execute esta função do .cshtml
arquivo
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
Arquivo
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
Nota: Seu arquivo externo deve ser referenciado antes do script acima. Caso contrário, a userDataDependent
função é indefinida.
Observe também que a função também deve estar no escopo global. Portanto, qualquer uma das soluções que temos para lidar com players com escopo global.