MVC 3 UpdateModel и SaveChanges - PullRequest
       3

MVC 3 UpdateModel и SaveChanges

1 голос
/ 29 января 2012

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

    [HttpPost]
    public ActionResult UploadPhoto(int id, FormCollection form)
    {
        Profile profile = db.Profiles.Find(id);

        var file = Request.Files[0];

        if (file.ContentLength > 512000)
        {
            ModelState.AddModelError(string.Empty, "Please limit your photo to 500 KB");
        }

        bool IsJpeg = file.ContentType == "image/jpeg";
        bool IsPng = file.ContentType == "image/png";
        bool IsGif = file.ContentType == "image/gif";

        if (!IsJpeg && !IsPng && !IsGif)
        {
            ModelState.AddModelError(string.Empty, "Only .jpeg, .gif, and .png images allowed");
        }

        if (file == null || file.ContentLength <= 0)
        {
            ModelState.AddModelError(string.Empty, "You must select an image to upload");
        }

        if (ModelState.IsValid)
        {
            try
            {
                string newFile = Path.GetFileName(file.FileName);
                file.SaveAs(Server.MapPath("/Content/users/" + User.Identity.Name + "/" + newFile));
                profile.ProfilePhotoPath = "/Content/users/" + User.Identity.Name + "/" + newFile;
                UpdateModel(profile);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        return View();
    }

Когда я пытаюсь загрузить изображение и пройти через него ...

Когда приложение попадает в эту строку:

profile.ProfilePhotoPath = "/Content/users/" + User.Identity.Name + "/" + newFile;

Показывает значение ProfilePhotoPath как «System.Web.HttpPostedFileWrapper»

Теперь, когда приложение выполняет следующую строку:

UpdateModel(profile);

Он показывает значение ProfilePhotoPath как "/Content/users/WebWired/myprofilepic.png", как и должно быть ...

Но тогда, когда приложение достигает следующей строки:

db.SaveChanges();

Внезапно значение ProfilePhotoPath снова становится "System.Web.HttpPostedFileWrapper" ... и так оно и сохраняется ...

Если это не достаточно странно, оноработал до того, как я начал добавлять логику к загрузке файла, но это действительно не должно иметь к этому никакого отношения, потому что оно передает все это ...

Кто-нибудь понимает, что здесь происходит, почемуон делает это, я делаю что-то не так?

1 Ответ

1 голос
/ 29 января 2012

UpdateModel () обновляет объект вашего профиля значениями от поставщика значений контроллера - то есть параметров POST и т. Д. Если он находит параметр POST с именем "ProfilePhotoPath", для вашего свойства profile.ProfilePhotoPath будет установлено это значение, перезаписывая значениеВы только что установили вручную.

Ваше поле <input type="file"> (или любой другой метод, который вы используете для отправки файла на сервер), похоже, имеет атрибут name: "ProfilePhotoPath".Это поле будет преобразовано в объект HttpPostedFileWrapper на сервере, содержащий информацию о опубликованном файле (длина содержимого, тип, имя файла и т. Д.).И это тот объект UpdateModel, который будет назначен для вашего свойства profile.ProfilePhotoPath (поскольку оно имеет то же имя, что и свойство).Поскольку он присваивает объект строковому свойству, он преобразует объект в строку, приводя к «System.Web.HttpPostedFileWrapper».

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