【解決方法】model.attachment が空なのはなぜですか


MVC と Razor-Pages を使用して .NET 7 ブログを作成しています。

私のモデルは次のとおりです。

C#
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http;

namespace MannsBlog.Models
{    
    public class ContactFormModel
    {        
        [Required]
        [EmailAddress]
        public string Email { get; set; } = string.Empty;
        
        [StringLength(4096, ErrorMessage = "Your message is too long. Please shorten it to max. 4096 chars.")]
        [MinLength(5)]
        [Required]
        public string Body { get; set; } = string.Empty;
        
        [Required]
        [StringLength(100, ErrorMessage = "Name is too long. Just 100 chars allowed.")]
        public string Name { get; set; } = string.Empty;
        
        [Required]
        [StringLength(150, ErrorMessage = "Subject too long. Just 150 chars allowed.")]
        public string Subject { get; set; } = string.Empty;
                
        public IFormFile? Attachment { get; set; }
    }
}

私が使用しているフォームとして:

HTML
@inject IViewLocalizer _localizer
@model MannsBlog.Models.ContactFormModel

<form id="myForm" enctype="multipart/form-data" class="form-vertical" asp-controller="Root" asp-action="Contact" method="post">
    <div class="form-group">
        <input class="e-input" name="Name" type="text" asp-for="Name" placeholder="@_localizer["your-name"]" />
        <span asp-validation-for="Name"></span>
        <input class="e-input" name="Subject" type="text" asp-for="Subject" placeholder="@_localizer["subject"]" />
        <span asp-validation-for="Subject"></span>
        <input class="e-input" name="Email" type="text" asp-for="Email" placeholder="@_localizer["email"]" />
        <span asp-validation-for="Email"></span>
        <ejs-richtexteditor id="Body" showCharCount="true" maxLength="600" value="@Model.Body" locale="@culture"></ejs-richtexteditor>
        <div id="dateError" style="padding-top: 10px"></div>
        <span asp-validation-for="Body"></span>
        <input class="samplebtn e-control e-btn" type="file" asp-for="Attachment" name="@_localizer["attachment"]" multipart />
    </div>
    <div style="text-align: center">
        <button id="validateSubmit" class="samplebtn e-control e-btn" type="submit" value="Send" data-ripple="true">@_localizer["submit"]</button>
        <button id="resetbtn" class="samplebtn e-control e-btn" type="reset" data-ripple="true">Reset</button>
    </div>
</form>

モデル内の参照をマークするために asp-for=”Attachment” を使用しています。

私のコントローラーには「連絡先」メソッドがあります:

C#
[HttpGet("contact")]
public IActionResult Contact()
{
    var contactModel = new ContactFormModel();
    return View(contactModel);
}

[HttpPost("contact")]
[ValidateAntiForgeryToken]
// [ValidateReCaptcha]
public async Task<IActionResult> Contact(ContactFormModel model)
{
    try
        {
            if (ModelState.IsValid)
            {
                if (model.Attachment.Length > 0)
                {

                if (await _mailService.SendMailAsync("ContactTemplate.txt", model.Name, model.Email, model.Subject, model.Body, model.Attachment))
                {                    
                    return View("Views/Root/EmailSent");
                }
            }
            else
            {
                if (await _mailService.SendMailAsync("ContactTemplate.txt", model.Name, model.Email, model.Subject, model.Body))
                {                    
                    return View("Views/Root/EmailSent");
                }
            }
        }
    }
    catch (Exception ex)
    {
        _logger.LogError("Failed to send email from contact page", ex);
        return BadRequest(new { Reason = "Error Occurred" });
    }
    return BadRequest(new { Reason = "Failed to send email..." });
}

コントローラーでの最初の試行でブレークポイントを設定しました。 メッセージを追加して添付ファイルを追加し、送信ボタンを使用すると、ブレークポイントに移動します。 モデルを見ていると、メール、本文、名前、件名が入​​力されていることがわかります。 しかし、添付ファイルには「null」しか表示されていません。

多分私は何かを逃した?

私が試したこと:

記事内を検索しました。 しかし、私が見つけたほとんどは、従来の ASP.NET MVC に関するものでした。 Blazor を使用したフォームに関するドキュメントをいくつか見つけました (使用した .cshtml ファイルの代わりに Razor 構文を使用した .razor ファイル)。
最後に、MS Learnでドキュメントを見つけました ファイルを ASP.NET Core にアップロードする | マイクロソフト ラーン[^]

最初の例は私のようなものです。

解決策 1

コメント

タイトルとURLをコピーしました