Редактировать объект модели не привязывается к виду, как ожидалось - PullRequest
0 голосов
/ 17 сентября 2009

Я использую ASP.NET MVC (1.0), Spark View Engine (1.0) и SubSonic (3.0.0.3).

У меня возникли проблемы с корректной работой представления "Редактировать". Итак, в моем контроллере у меня есть следующее действие контроллера, которое отображает представление формы редактирования:

[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);
}

Форма в этом представлении отправляет обратно к следующему действию контроллера:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(Plot plot)
{
    var validator = new PlotValidator();
    try
    {
        var results = validator.Validate(plot);
        if (!results.IsValid)
        {
            ...
        }
    }
}

Проблема, с которой я столкнулся, заключается в том, что первое действие контроллера фактически не заполняет форму значениями из объекта Plot, переданного ей. Единственный способ получить его для заполнения формы - добавить график в ViewData:

ViewData["plot"] = plot;

Это заполняет форму редактирования, но когда я редактирую значения и отправляю его обратно во второе действие контроллера, указанное выше, он просто отправляет обратно, в основном, новый график с новыми значениями, а не график, отправленный в форму редактирования с обновленными значениями.

Я уверен, что, возможно, мне просто не хватает чего-то простого, но я не могу понять, что это такое. Все поля в моей форме имеют идентификаторы с префиксом «plot».

Кто-нибудь знает / видит, что я делаю не так? Спасибо.

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Привет, Роберт. Я не знаю, как Spark обрабатывает эти данные, но я могу сказать, что вторую часть довольно просто исправить.

Во-первых, вы должны помнить, что MVC не попадет в БД за вас. В вашем случае ваши критерии для извлечения записи, кажется, включают в себя два критерия - поэтому вам придется проверять это снова, если вы хотите убедиться, что данные установлены правильно. Поэтому на POST измените свою подпись на это:

[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)
        {
            ...
        }
    }
}

Это бесплатно, но так или иначе вы должны делать это с L2S ...

1 голос
/ 17 сентября 2009

Я не знаю, как это делается в движке представления Spark, но в встроенном движке представления, который поставляется с ASP.NET MVC, это делается путем наследования объекта модели представления со строгим типом в страница, использующая директиву page, а не словарь, который поставляется с обычным ViewPage.

Итак, вместо первой строки кода в представлении, похожем на это:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage" %>

Это будет выглядеть примерно так:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<HomePageViewModel>" %>

Ваш текущий код контроллера ожидает строго типизированный объект, но вместо этого он возвращает словарь ViewData. Так что никакой привязки не происходит.

Рассмотрите возможность просмотра следующего подкаста:

Изучение того, как использовать ViewData (со строгим и слабым шрифтом) с Spark http://www.dimecasts.net/Casts/CastDetails/117

...