Обновите строку в ASP.NET и MVC LINQ to SQL - PullRequest
2 голосов
/ 15 сентября 2009

У меня есть простая строка, которая имеет 4 столбца:

{ [Primary Key Int]RowID, [text]Title, [text]Text, [datetime]Date }

Я бы хотел, чтобы пользователь мог редактировать эту строку на простой странице, которая имеет форму с полями «Заголовок» и «Текст».

Есть скрытое поле для хранения RowID.

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

Вот мое действие:

[AcceptVerbs(HttpVerb.Post)]
public ActionResult EditRow(Row myRow)
{
    RowRepository.SaveRow(myRow)   
    return View("Success");
}

RowRepository:

public void SaveRow(Row myRow)
{
    db.MyRows.Attach(myRow);
    db.Refresh(RefreshMode.KeepCurrentValues, myRow);
    db.SubmitChanges();
}

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

Как я могу просто сказать, чтобы сохранить старые значения? Я пытался сделать RefreshMode.KeepChanges и ничего.

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

В данный момент я не могу проверить это, но попробуйте сделать столбец datetime обнуляемым, а затем убедиться, что datetime, переданный в SaveRow, имеет нулевое значение.

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

Попробуйте

[AcceptVerbs(HttpVerb.Post)]
public ActionResult EditRow([Bind(Exclude="Date")] Row myRow) {
  RowRepository.SaveRow(myRow)   
  return View("Success");
}

Обновление

Попробуйте этот подход, когда на вашей странице нет поля «Дата»

[AcceptVerbs(HttpVerb.Post)]
public ActionResult EditRow(int RowID) {
  Row myRow = RowRepository.GetRow(RowID);
  UpdateModel(myRow);
  RowRepository.Save();
  return View("Success");
}

В вашем хранилище

public void Save() {
  db.SubmitChanges();
}

Это сохранит только изменения, внесенные в 'myRow'

0 голосов
/ 15 сентября 2009

Вам потребуется добавить метод в частичный класс / переопределить код, который он строит.

Класс Table реализует INotifyPropertyChanging | ed, который используется для отслеживания того, какой столбец был изменен.

Вы можете взломать его и сбросить значение «this.PropertyChanged».

Но то, что я делаю на работе, - это глупый подход READ-APPLY-WRITE (и я использую WebForm).

public void SaveRow(Row myRow)
{
    var obj=db.MyRows.Where(c=>c.id==myRow.id).First();
    obj.a=myRow.a;
    obj.b=myRow.b;
    db.SubmitChanges();
}

Вы можете сделать немного проще.

public void SaveRow(Row myRow)
{
    db.MyRows.Attach(new Row(){
        Id=myRow.Id,
        Title=myRow.Title,
        Text=myRow.Text,
    });
    db.SubmitChanges();
}

PS. Я новичок в LINQ to SQL. Пожалуйста, дайте мне знать, если есть более разумный способ сделать это.

0 голосов
/ 15 сентября 2009

Хорошо, я установил его на nullable, и он продолжает перезаписывать базу данных как нулевое значение. Я предполагаю, что это невозможно сделать, поскольку технически пустое значение является допустимым значением для столбца, и если я передаю объект функции, пустые значения должны содержать что-то или быть нулевыми.

Так что мне нужно было бы явно указать значение базы данных для этого столбца

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...