Загрузка файла приводит к сбою проверки модели - PullRequest
2 голосов
/ 31 января 2012

У меня есть форма MVC3, привязанная к модели с элементом управления загрузкой файлов. (Дополнительный HTML удален для краткости):

@model Models.MessageModel

<script type="text/javascript">
    var numAttachments = 0;
    $(function () {
        $(".add-attachment").click(function () {
            $(".attachments").append("<div><input type=\"file\" name=\"attachments\" id=\"attachment" + numAttachments + "\" /></div>");
        });
    });
</script>

@using (Html.BeginForm())
{
    @Html.ValidationSummary()
        <div class="field-label">Subject:
            @Html.EditorFor(model => model.Subject)
        </div>
        <div class="attachments">
        </div>
        <div>
            <a href="javascript:void(0);" class="add-attachment">Add Attachment</a>
        </div>
        <div class="message-text">@Html.TextAreaFor(model => model.Text, new { cols = 107, rows = 10 })</div>
        <input type="submit" value="Send Message" />
    </div>
}

Пользователи могут выбрать добавление нескольких вложений, нажав ссылку «Добавить вложение», вложения не требуются.

Моя модель выглядит следующим образом:

public class MessageModel
{
    [Required]
    public string Subject { get; set; }

    [Required]
    public string Text { get; set; }

    public IEnumerable<HttpPostedFileBase> Attachments { get; set; }
}

(ПРИМЕЧАНИЕ. Я также пытался переместить вложения из модели в аргумент моего метода действия с теми же результатами)

Мое действие:

[HttpPost]
public ActionResult New(MessageModel message)
{
    // this check passes if no file is uploaded
    // but once a file is uploaded, this evaluates to false
    // even if the model is valid
    if (ModelState.IsValid) 
    {
        // do stuff
    }
}

Эта форма работает нормально, и проверка проходит, когда для загрузки не выбран ни один файл. Когда я выбираю файл для загрузки, ModelState.IsValid становится ложным. Как я могу заставить проверку игнорировать загруженные файлы?

1 Ответ

2 голосов
/ 31 января 2012

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

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

Загрузка файла MVC 3 и привязка модели

...