asp.net mvc3 Bind Exclude на свойства не работает - PullRequest
2 голосов
/ 17 марта 2012

У меня есть класс, который имеет 8 свойств / 8 столбцов в БД. На странице редактирования я хочу исключить поля AddedDate и UserID. Когда пользователь редактирует ваучер, он не может перезаписать значения AddedDate или UserID в БД.

public class Voucher
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string SiteName { get; set; }
    public string DealURL { get; set; }
    public DateTime AddedDate { get; set; }
    public DateTime? ExpirationDate { get; set; }
    public string VoucherFileURL { get; set; }
    public Guid UserID { get; set; }
}

Вот что у меня есть для контроллера Edit:

// POST: /Voucher/Edit/5

[HttpPost]
public ActionResult Edit([Bind(Exclude = "AddedDate")]Voucher voucher)
{
    if (ModelState.IsValid)
    {

        db.Entry(voucher).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(voucher);
}

На странице редактирования, когда я нажимаю на кнопку отправить, я получаю следующую ошибку:

System.Data.SqlServerCe.SqlCeException: An overflow occurred while converting to datetime.

Похоже, что AddedDate не был исключен из объекта ваучера и вызвал ошибку.

Пожалуйста, дайте мне знать, как это исправить? Спасибо!

(это обновленная версия asp.net mvc3 UpdateModel исключать свойства не работает , я пойду с другим подходом)

1 Ответ

4 голосов
/ 18 марта 2012

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

public class VoucherViewModel
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string SiteName { get; set; }
    public string DealURL { get; set; }
    public DateTime? ExpirationDate { get; set; }
    public string VoucherFileURL { get; set; }
}

, а затем:

[HttpPost]
public ActionResult Edit(VoucherViewModel model)
{
    // TODO: if the view model is valid map it to a model
    // and pass the model to your DAL
    // To ease the mapping between your models and view models
    // you could use a tool such as AutoMapper: http://automapper.org/
    ...
}

ОБНОВЛЕНИЕ:

ВВ разделе комментариев @ Rick.Anderson-at-Microsoft.com указывается, что, хотя я и ответил на ваш вопрос, я не объяснил, откуда возникла проблема.

Дело в том, что DateTime - это тип значения, означающий, что он всегда будет иметь значение.[Bind(Exclude = "AddedDate")] прекрасно работает и делает то, что должен делать => он не связывает свойство AddedDate из запроса.Как следствие, свойство будет иметь значение по умолчанию, которое для поля DateTime равно 1/1/0001 12:00:00 AM, и когда он пытается сохранить его в SQL Server, оно прерывается, потому что SQL Server не поддерживает такой формат.

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