objeto Editar modelo não ligar a vista como esperado
-
07-07-2019 - |
Pergunta
Eu estou usando ASP.NET MVC (1,0), o Spark Ver Engine (1.0) e SubSonic (3.0.0.3).
Eu estou tendo alguns problemas para obter uma visão "Editar" para trabalho corretamente. Então, no meu controlador, eu tenho a seguinte ação do controlador que exibe o modo de edição de formulário:
[AcceptVerbs(HttpVerbs.Get)]
public virtual ActionResult Edit(string name)
{
var plot = Plot.SingleOrDefault(p => p.UserID == LoggedInUser.ID && p.UrlFriendlyName == name);
// ViewData["plot"] = plot;
return View(plot);
}
O formulário em que a visão envia de volta para a seguinte ação do controlador:
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(Plot plot)
{
var validator = new PlotValidator();
try
{
var results = validator.Validate(plot);
if (!results.IsValid)
{
...
}
}
}
O problema que estou tendo, é que a primeira ação do controlador na verdade não preencher o formulário com os valores do objeto Plot que lhe é submetido. A única maneira que eu possa obtê-lo a preencher o formulário está adicionando a trama para ViewData:
ViewData["plot"] = plot;
que preenche o formulário de edição, mas quando eu editar os valores, e enviá-lo de volta para a segunda ação do controlador listados acima, ele simplesmente envia de volta, basicamente, um novo lote com os novos valores, não a trama enviada para o formulário de edição com valores atualizados.
Eu tenho certeza que estou provavelmente só faltando algo simples, mas eu não consigo descobrir o que é. Todos os campos no meu formulário têm IDs que são prefixados com "plot".
Alguém sabe / ver o que estou fazendo de errado? Obrigado.
Solução
Eu não sei como é feito no mecanismo de exibição Spark, mas no mecanismo de exibição out-of-the-box que vem com o ASP.NET MVC, isso é feito por herdar um objeto de exibição modelo de rigidez no a página usando uma diretiva de página, em vez de usar o dicionário que vem com o ViewPage plain vanilla.
Assim, em vez da primeira linha de código na vista parecido com isto:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage" %>
Será algo mais parecido com isto:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<HomePageViewModel>" %>
Seu código atual controlador está esperando um objeto fortemente tipado, mas ele está ficando para trás um dicionário ViewData vez. Assim, nenhuma ligação está ocorrendo.
Considere analisando a seguinte Podcast:
Explorando como usar ViewData (Fortemente digitado e digitado fraco) com faísca http://www.dimecasts.net/Casts/CastDetails/117
Outras dicas
Hey Robert -. Eu não sei como alças faísca é dados, mas posso dizer-lhe que a segunda parte é bastante simples de correção
Em primeiro lugar - você tem que lembrar MVC não vai chegar para o DB para você. No seu caso seus critérios para retirar um registro parece envolver dois critérios - assim você vai ter que puxar isso de novo, se você quer ter certeza de que os dados são ajustados corretamente. Assim por diante POST mudar a sua assinatura a este:
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(string id, FormCollection form)
{
//assuming you have some kind of PK
var plot = Plot.SingleOrDefault(p => p.ID == id);
UpdateModel(plot, form.ToValueProvider());
var validator = new PlotValidator();
try
{
var results = validator.Validate(plot);
if (!results.IsValid)
{
...
}
}
}
Esta é freehanded - mas é como você tem que fazê-lo com L2S de qualquer maneira ...