Member 14625279 Ответов: 1

Проблема загрузки файлов в MVC


У меня есть проблема, которую я не могу понять.

Это проблема:
HttpPostedFileBase возвращает null и запрос.Файлы.Счетчик возвращает ноль.

мой взгляд:
@model List<BorcAlacakMvc.Models.BaBelgeVM>

@{
    ViewBag.Title = "";
    Layout = null;
}

@using (Html.BeginForm("BaBelgeKaydet", "BorcAlacak", FormMethod.Post, new { id = "popupForm", enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    <h4>@ViewBag.Title</h4>
    <table>
        <thead>
            <tr>
                <th>Sıra</th>
                <th>Belge</th>
                <th>Belge Tarihi</th>
                <th>Belge No</th>
                @*<th>Veri</th>*@
                @*<th></th>*@
            </tr>
        </thead>
        <tbody>
            @if (Model != null && Model.Count > 0)
            {
                int j = 0, s = 0;
                foreach (var i in Model)
                {
                    string dosya = "dosya" + j.ToString();
                    <tr>
                        @Html.HiddenFor(k => k[j].ID)
                        @Html.HiddenFor(k => k[j].SebepBelgeID)
                        @Html.HiddenFor(k => k[j].BorcAlacakID)
                        @if (i.BelgeSira > 0)
                        {
                            <td>@Html.DisplayFor(k => k[j].BelgeSira, new { htmlAttributes = new { @class = "form-control" } })</td>
                        }
                        else
                        {
                            s++;
                            <td>@Html.DisplayFor(k => k[j].BelgeSira, new { value = s})</td>
                        }
                        <td>@Html.DisplayFor(k => k[j].BelgeAdi, new { htmlAttributes = new { @class = "form-control" } })</td>
                        <td>@Html.EditorFor(k => k[j].BelgeTarihi, new { htmlAttributes = new { @class = "form-control" } })</td>
                        <td>@Html.EditorFor(k => k[j].BelgeNo, new { htmlAttributes = new { @class = "form-control" } })</td>
                        <td>@Html.HiddenFor(k => k[j].Veri, new { htmlAttributes = new { @class = "form-control" } })</td>
                        <td>@Html.TextBoxFor(k => k[j].UBelge, new { type = "file" })</td>
                        @*<td><input type="file" id="@j" name="dosya" /></td>*@
                    </tr>
                    j++;
                }
            }
        </tbody>
    </table>
    <div class="row" style="border:ridge">
        <div class="col-md-offset-2 col-md-4">
            <input type="submit" value="Kaydet" class="btn btn-success" />
        </div>
    </div>
    <div class="err">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    </div>
}


мой контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult BaBelgeKaydet(List<BaBelgeVM> baBelgeVM, HttpPostedFileBase[] UBelge)
{
    var Dosya = Request.Files.Count;

    var errors = ModelState.Where(f => f.Value.Errors.Count > 0).Select(s => new { s.Key, s.Value.Errors }).ToArray();
    bool durum = false;
    if (ModelState.IsValid)
    {
        if (YeniKayit == true)
        {
            foreach (var Kayit in baBelgeVM)
            {
                int i = 0;
                //string DosyaID = Convert.ToString(Kayit.Sira);
                //var Dosya = Request.Files.Count;
                string DosyaYukle = "[" + i + "]UBelge";
                HttpPostedFileBase UBelge = Request.Files[DosyaYukle];
                var DosyaYolu = Path.Combine(Server.MapPath("~App_Data/Upload"), borcalacakid.ToString());
                BorcAlacakBelge borcAlacakBelge1 = new BorcAlacakBelge()
                {
                    Sira = Kayit.BelgeSira,
                    BorcAlacakID = borcalacakid,
                    SebepBelgeID = Kayit.SebepBelgeID,
                    BelgeTarihi = Kayit.BelgeTarihi,
                    BelgeNo = Kayit.BelgeNo,
                    Veri = DosyaYolu
                };
                i++;
                //Dosya.SaveAs(DosyaYolu);
                db.BorcAlacakBelge.Add(borcAlacakBelge1);
                db.SaveChanges();
            }
        }
        db.SaveChanges();
        durum = true;
    }
    return new JsonResult { Data = new { durum = durum } };
}


Моя Модель Представления:

public class BaBelgeVM
{
    public int ID { get; set; }
    public int BelgeSira { get; set; }
    public int BorcAlacakID { get; set; }
    public int SebepBelgeID { get; set; }
    public string SebepAdi { get; set; }
    public int SebepID { get; set; }
    public string BelgeAdi { get; set; }
    public int BelgeID { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime BelgeTarihi { get; set; }
    public string BelgeNo { get; set; }
    public string Veri { get; set; }
    public HttpPostedFileBase UBelge { get; set; }
    public List<BorcAlacakBelge> borcAlacakBelge  { get; set; }
    public List<BelgeListesi> belgeListesi { get; set; }
}


Что я уже пробовал:

Сохранение списка документов, созданных в соответствии с выбранной пользователем причиной, в базу данных и хранение их на сервере.

Например:
Три разных документа по причине "х"
Пять разных документов по причине "Y"
Шесть различных документов по причине "Z"

F-ES Sitecore

Ваш код никак не связан. Функция, которая принимает файлы, - это DocumentSave, но вы нигде не ссылаетесь на нее.

Member 14625279

Я не могу тебя понять. Пожалуйста, не могли бы вы дать мне более подробную информацию?

Richard Deeming

Ваше действие называется DocumentSave. Ваша модель представления называется DocumentVM, который имеет свойства, называемые ID, ReasonID, RowNumber, DocumentDate, DocumentNo, и UploadDocument.

Вид, который Вы нам показали, публикуется в действии под названием BaBeKaydet. Его модель представления представляет собой список BorcAlacakMvc.Models.BaBelgeVM объекты, которые, как представляется, имеют свойства, называемые ID, SebepBelgeID, BorcAlacakID, BelgeSira, BelgeAdi, BelgeTarihi, BelgeNo, Veri, и UBelge. Он не имеет HttpPostedFileBase собственность.

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

Нажмите на зеленую ссылку "улучшить вопрос" и обновите свой вопрос, чтобы включить реальный" просмотр, действие и viewmodel, которые вы используете.

Member 14625279

Извиняюсь. Я редактирую.

1 Ответов

Рейтинг:
2

Richard Deeming

Цитата:
string DosyaYukle = "[" + i + "]UBelge";
HttpPostedFileBase UBelge = Request.Files[DosyaYukle];
Ты упускаешь что-то важное. "." во имя:
string DosyaYukle = "[" + i + "].UBelge";
HttpPostedFileBase UBelge = Request.Files[DosyaYukle];
Вы также всегда смотрите только на первый предмет, так как i это всегда так 0.

Но вам не нужно делать это таким образом; просто используйте свойство из viewmodel:
HttpPostedFileBase UBelge = Kayit.UBelge;


Member 14625279

HttpPostedFileBase[] UBelge возвращает null и запрос.Файлы.Счетчик возвращает ноль.
Например
UBelge{0] null
UBelge[1] null
UBelge[2] null
...

Richard Deeming

Если Request.Files коллекция пуста, значит, вы не выбрали никаких файлов для загрузки.

Member 14625279

Я выбираю файлы, но они не передаются из представления в контроллер. Пожалуйста смотрите https://youtu.be/yXQV915WNys