asp.net mvc 3 - загрузка файла на сервер Я не могу сохранить имя файла в модель базы данных - PullRequest
0 голосов
/ 11 июня 2011

Что не так с этим:

View

@model GestionWeb.DAL.Client
@using (Html.BeginForm("Index", "Config", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.LabelFor(model => model.TimeZone)
    @Html.EditorFor(model => model.TimeZone)
    @Html.ValidationMessageFor(model => model.TimeZone)

    @Html.HiddenFor(model => model.ClientId)
    @Html.LabelFor(model => model.Logo)
    <input type="file" name="Logo" id="Logo" />
    @Html.ValidationMessageFor(model => model.Logo)
   <input type="submit" value="Upload" />
}

Контроллер:

[HttpPost]
public ActionResult Index(Client client)
{
    if (ModelState.IsValid)
    {
        if (Request.Files[0].ContentLength > 0)
        {
            HttpPostedFileBase file = Request.Files[0];
            string filePath = Path.Combine(HttpContext.Server.MapPath("/Upload/"), Path.GetFileName(file.FileName));
            file.SaveAs(filePath);
            client.Logo = file.FileName;
        }
        db.Client.Attach(client);
        UpdateModel<Client>(client);
        //db.ObjectStateManager.ChangeObjectState(client, EntityState.Modified);
        db.SaveChanges();

        return RedirectToAction("Index");
     }
     return View(client);
}

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

Что я делаю не так? Я не могу понять !!!

Спасибо

Ответы [ 3 ]

1 голос
/ 12 июня 2011

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

1 голос
/ 14 июня 2011

Я обнаружил проблему, client.Logo = "blabla" должно быть после метода UpdateModel, я не знаю почему, потому что если я отлаживаю код, то значение client.Logo, которое я установил, не стирается после выполнения UpdateModel, как это:

[HttpPost]
public ActionResult Index(Client client)
{
    if (ModelState.IsValid)
    {
        if (Request.Files[0].ContentLength > 0)
        {
            HttpPostedFileBase file = Request.Files[0];
            string filePath = Path.Combine(HttpContext.Server.MapPath("/Upload/"), Path.GetFileName(file.FileName));
            file.SaveAs(filePath);
        }
        db.Client.Attach(client);
        UpdateModel<Client>(client);
        **client.Logo = file.FileName;**
        db.SaveChanges();

       return RedirectToAction("Index");
     }
     return View(client);
}
1 голос
/ 12 июня 2011

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

Например, вы можете сгенерировать имя файла, используя строку .Format ():

string myGeneratedFileName = string.Format ("client-logo- {0}", Guid.NewGuid ());string filePath = Path.Combine (HttpContext.Server.MapPath ("/ Upload /"), myGeneratedFileName);file.SaveAs (Filepath);client.Logo = myGeneratedFileName;

И кстати, вы можете обрабатывать исключения на file.SaveAs().

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