Eu tenho o seguinte modelo, que está envolvido no meu modelo de exibição
public class FloorPlanSettingsModel
{
public int Id { get; set; }
public int? MainFloorPlanId { get; set; }
public string ImageDirectory { get; set; }
public string ThumbnailDirectory { get; set; }
public string IconsDirectory { get; set; }
}
Como acesso uma das propriedades acima do Javascript?
Eu tentei isso, mas fiquei "indefinido"
var floorplanSettings = "@Model.FloorPlanSettings";
alert(floorplanSettings.IconsDirectory);
c#
javascript
jquery
asp.net-mvc
model
Referência nula
fonte
fonte
Respostas:
Você pode pegar todo o modelo do lado do servidor e transformá-lo em um objeto Javascript, fazendo o seguinte:
No seu caso, se você deseja apenas o objeto FloorPlanSettings, basta passar o
Encode
método nessa propriedade:fonte
Como acessar os dados do modelo no bloco de código Javascript / Jquery no
.cshtml
arquivoExistem dois tipos de
Model
atribuições c # variable ( ) à variável JavaScript.int
,string
,DateTime
(ex:Model.Name
)Model
,Model.UserSettingsObj
)Vamos analisar os detalhes dessas duas atribuições.
Para o restante da resposta, vamos considerar o
AppUser
modelo abaixo como exemplo.E os valores que atribuímos a este modelo são
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.
Como você pode ver, existem alguns erros,
Raj
eTrue
são consideradas variáveis javascript e, como elas não existem, é umvariable undefined
erro. Onde, quanto à variável dateTime, o erro é que osunexpected 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.
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 aspasOs resultados são semelhantes ao nosso caso de teste 1. No entanto, o uso
@Html.Raw()
daHTML
string nos mostrou algumas mudanças. O HTML é mantido sem alterar os nomes de entidade.Dos documentos Html.Raw ()
Mas ainda temos erros em outras linhas.
4) Usando
@Html.Raw
e também envolvendo-o entre aspasOs 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)2) Escape do significado do caractere no código do lado do servidor. Gostar
Conclusão da cessão de propriedades
Html.Raw
para interpretar seus dados HTML como estão.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.
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
3) Usando
Html.Raw
sem aspas.4) Usando
Html.Raw
junto com aspasNão
Html.Raw
foi muito útil para nós ao atribuir um objeto à variável.5) Usando
Json.Encode()
sem aspasNó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 ()
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 deHtml.Raw
. Então, vamos tentar isso. Vamos combinarHtml.Raw
eJson.Encode
6) Usando
Html.Raw
eJson.Encode
sem aspas.Resultado é um objeto Javascript válido
7) Usando
Html.Raw
eJson.Encode
entre aspas.Como você vê, o agrupamento com aspas nos fornece dados JSON
Conslusão na atribuição de objetos
Html.Raw
eJson.Encode
em combinação para atribuir seu objeto à variável javascript como objeto JavaScript .Html.Raw
eJson.Encode
envolva-o tambémquotes
para obter um JSONNota: 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 umdate
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 ()Como acessar os dados do modelo no bloco de código Javascript / Jquery no
.js
arquivoA 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 seriaCom isso, podemos usar as variáveis
userObj
euserJsonObj
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
arquivoexternal.js
.cshtml
ArquivoNota: 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.
fonte
var model = @Html.Raw(Json.Encode(Model));
isso criará um objeto javascriptmodel
que não tem conexão com o modelo C # que você passa para a visualização. De fato, não haveráModel
após a exibição da exibição. Portanto, o formulário na interface do usuário não terá idéia das alterações nos dados do objeto javascript. Agora você precisa passar todo esse modelo modificado para o controlador via AJAX, ou atualizar o valor dos seus controles de entrada no formulário usando javascript.Although I did the same thing using hidden Html control and bound it to EventCommand and updated it's value in javascript. But wondering if could do same directly to model?
para esta declaração .. não existeEventCommand
no MVC, é para Webforms onde há uma conexão entre a interface do usuário e as ações do servidor. No MVC, tudo é separado. Única maneira de você interagir com o controlador é através de AJAX ou Form Submit ou Nova solicitação de página (de recarga também)tente o seguinte: (você perdeu as aspas simples)
fonte
JSON
sem citações fornece ajavascript Object
. Verifique minha resposta no mesmo tópico para obter mais detalhes. stackoverflow.com/a/41312348/2592042Envolvendo a propriedade model em torno de parens funcionou para mim. Você ainda tem o mesmo problema com o Visual Studio reclamando sobre o ponto-e-vírgula, mas funciona.
fonte
Se o erro "ReferenceError: Model is not defined" for gerado, você poderá tentar usar o seguinte método:
Espero que isto ajude...
fonte
Sei que é tarde demais, mas esta solução está funcionando perfeitamente para a estrutura .net e o núcleo .net:
@ System.Web.HttpUtility.JavaScriptStringEncode ()
fonte