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.

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top