ASP. NET MVC Текстовые поля не отправляются в модель, если форма содержит файлы и текстовые поля - PullRequest
0 голосов
/ 12 июля 2020

Я разработал форму, в которой поля формы содержат поля type=text и type=file поля.

@using (Html.BeginForm("UploadFiles", "Home", FormMethod.Post, new { enctype = "multipart/form-data"}))
{
    @Html.AntiForgeryToken()

    <div class="container">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="row justify-content-center align-items-center">
            <div class="card border-info col-sm-6">
                <div class="card-body">
                    <div class="form-group">
                        @Html.LabelFor(model => model.UploadForm.Name, new { @class = "control-label" })
                        @Html.TextBoxFor(model => model.UploadForm.Name, "", htmlAttributes: new { @type = "text", @class = "form-control", aria_describedby = "nameHelp", placeholder = "Enter name" })
                        <small id="nameHelp" class="form-text text-muted">Name to be associated</small>
                        @Html.ValidationMessageFor(model => model.UploadForm.Name, "", new { @class = "text-danger" })
                    </div>
                    <div class="form-group">
                        @Html.LabelFor(model => model.UploadForm.files, htmlAttributes: new { @class = "control-label" })
                        @Html.TextBoxFor(model => model.UploadForm.files, "", htmlAttributes: new { @type = "file", @multiple = "multiple", @class = "form-control-file", aria_describedby = "filesHelp" })
                        
                        <small id="filesHelp" class="form-text text-muted">Files to be uploaded</small>
                        @Html.ValidationMessageFor(model => model.UploadForm.files, "", new { @class = "text-danger" })
                    </div>
                    <div class="row justify-content-end" style="margin-right:1px;">
                        <input type="submit" value="Upload" class="btn btn-primary w-25"/>
                    </div>
                </div>
            </div>
        </div>
        <hr />
    </div>
}

Мой контроллер выглядит как под

[HttpPost]
public ActionResult UploadFiles(HomeModel model)
{        
    if (ModelState.IsValid)
    {
        **// getting model.UploadForm.Name null here**
        **// getting model.UploadForm.files is populated and contains files**
    }
    
    return View("Index", model);
}

Am Я что-то упустил?

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

UploadFiles (string name, HttpPostedFile[] files) 
{
        // both args are coming null
}

Изменить:

Это моя модель в соответствии с запросом:

public class HomeModel
{
    public UploadForm UploadForm { get; set; }
    public List<UploadedItem> UploadedItems { get; set; }
}

и вот как выглядит UploadForm

public class UploadForm
{
    [Display(Name = "Name")]
    [Required(ErrorMessage = "Please enter name.")]
    public string Name;

    [Required(ErrorMessage = "Please select file(s).")]
    [Display(Name = "Files")]
    public HttpPostedFileBase[] files { get; set; }
}

1 Ответ

0 голосов
/ 12 июля 2020

в вашем классе UploadForm, имя отсутствует get set

public class UploadForm
{
    [Display(Name = "Name")]
    [Required(ErrorMessage = "Please enter name.")]
    public string Name { get; set; };

    [Required(ErrorMessage = "Please select file(s).")]
    [Display(Name = "Files")]
    public HttpPostedFileBase[] files { get; set; }
}
...