asp.net mvc - выборочное получение значений из набора входных данных

У меня есть куча текстовых входов на моей странице (HTML.TEXTBOX, созданный через цикл for), и я хочу прочитать их значения и зафиксировать в базе данных только тогда, когда пользователь что-то изменил в этих текстовых полях.

Что было бы правильным способом сделать это? (Как вы думаете, имеет ли смысл зафиксировать все это в базе данных, если количество текстовых полей меньше 100?)

Кроме того, как мне в целом прочитать значения из кучи текстовых полей и зафиксировать в базе данных? Мне нужно что-то, что использует пару ключ-значение, где ключ будет идентификатором, а значение будет вводом в текстовое поле.


person Community    schedule 07.09.2009    source источник


Ответы (2)


Если вы не используете, например, поля JavaScript и hidden для отслеживания изменений пользователя, у вас нет возможности узнать, какие поля были изменены, без запроса к базе данных, поскольку Интернет в целом и ASP.NET MVC в частности не имеют состояния. . Однако, если вы зацикливаете поля с их значениями, заполненными данными, хранящимися в объекте, вы, вероятно, можете сохранить этот объект в переменной сеанса для сравнения при следующем запросе.

Псевдопример:

public ActionResult GetFormView() 
{
     var values = (select relevant information from db and store in a 
                   IQueryable<Dictionary<string, string>> or something similar
                   where you have a relation between input field id/name and value);

     Session["TheInputListValues"] = values;

     return View(values);    // Your view renders your list of input fields
}


[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveChanges(FormCollection form)
{
    var oldValues = (Dictionary<string, string>)Session["TheInputListValues"];
    var changedValues = new Dictionary<string, string>();

    foreach(string key in form.AllKeys)
    {
        if(oldValues.ContainsKey(key))
        {
            if (oldValues[key] != form[key])
            {
                changedValues(key, form[key]);
            }
        }
    }

    SaveToDB(changedValues);

    return Redirect("SomeWhereElse"); // PRG is king!
}

Я не тестировал эту реализацию, но стоит попробовать =)

person Tomas Aschan    schedule 07.09.2009

Я сделал что-то подобное с помощью jQuery, и это работает очень хорошо. Прикрепите поведение к текстовым полям, где, если данные изменяются, отправьте его значение действию, которое сохраняет данные.

$(function(){
  $("input[type='text']").change(function(){
    $.post("/SaveChanges",{id: $(this).attr("id"),value : $(this).attr("text")}); 
  });
});

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

<input id="4576" name="4576"/>

у вас также может быть обратный вызов, который скажет добавить класс в это поле, сообщая им, что информация была сохранена, изменив ее на зеленый цвет или что-то в этом роде.

Дополнительные сведения см. здесь: http://docs.jquery.com/Ajax/jQuery.post

person Slee    schedule 07.09.2009
comment
это не проверено, и я просто быстро написал это с головы - person Slee; 07.09.2009