файл изображения не передан контроллеру, показывает нулевое значение MVC - PullRequest
0 голосов
/ 30 октября 2018

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

Контроллер

  [HttpPost]
        public ActionResult Index(EmployeeModel obj)
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
            client.EnableSsl = true;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("abc@hotmail.com", "******");
            MailMessage msgobj = new MailMessage();
            msgobj.To.Add(obj.ToEmail);
            msgobj.From = new MailAddress("abc@hotmail.com");
            msgobj.Body = obj.EMailBody;
            msgobj.Subject = obj.EmailSubject;
            msgobj.CC.Add(obj.EmailCC);
            msgobj.Bcc.Add(obj.EmailBCC);

            if(obj.imageFile !=null)
            {
                msgobj.Attachments.Add(new Attachment(obj.imageFile.InputStream.ToString(), obj.imageFile.FileName));
            }

            client.Send(msgobj);
            ViewBag.Success = "Email Send Successfully";




            return View();
        }

Модель:

[DataType(DataType.EmailAddress),Display(Name = "TO")]
        [Required]
        [Key]
        public string ToEmail { get; set; }

        [DataType(DataType.MultilineText)]
        [Display(Name ="Body")]
        [Required]
        public string EMailBody { get; set; }

        [Display(Name ="Subject")]
        [Required]
        public string EmailSubject { get; set; }

        [Display(Name ="CC")]
        [DataType(DataType.EmailAddress)]
        public string EmailCC { get; set; }
        [Display(Name ="BCC")]
        [DataType(DataType.EmailAddress)]
        public string EmailBCC { get; set; }

        public HttpPostedFileWrapper imageFile { get; set; }
        public string imageUrl { get; set; }

HTML

 @using (Html.BeginForm()) 
    {
        @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Employee Model</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.ToEmail, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ToEmail, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ToEmail, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EMailBody, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EMailBody, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EMailBody, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EmailSubject, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EmailSubject, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EmailSubject, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EmailCC, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EmailCC, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EmailCC, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EmailBCC, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EmailBCC, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EmailBCC, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.imageFile, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <input type="file" id="imageFile" name="imageFile" accept="image/jpeg, image/png" />

            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Send" class="btn btn-default" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10 text-success">
                @ViewBag.Status
            </div>
        </div>
    </div>
    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Во-первых, вы должны изменить это свойство:

public HttpPostedFileWrapper imageFile { get; set; }

к этому:

public HttpPostedFileBase imageFile { get; set; }

Во-вторых, добавьте enctype="multipart/form-data к помощнику BeginForm:

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

Также вы используете SMTP-движок Gmail, но настройки вашей сетевой учетной записи, похоже, используют Hotmail, у них обоих разные настройки. Вот примеры правильных настроек:

Gmail SMTP

SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("xxxxx@gmail.com", "******");
MailMessage msgobj = new MailMessage();
msgobj.To.Add(obj.ToEmail);
msgobj.From = new MailAddress("xxxxx@gmail.com");
msgobj.Body = obj.EMailBody;
msgobj.Subject = obj.EmailSubject;
msgobj.CC.Add(obj.EmailCC);
msgobj.Bcc.Add(obj.EmailBCC);

if (obj.imageFile != null && obj.imageFile.ContentLength > 0)
{
    msgobj.Attachments.Add(new Attachment(obj.imageFile.InputStream, obj.imageFile.FileName));
}

client.Send(msgobj);

Hotmail SMTP

SmtpClient client = new SmtpClient("smtp.live.com", 587);
client.EnableSsl = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("xxxxx@hotmail.com", "******");
MailMessage msgobj = new MailMessage();
msgobj.To.Add(obj.ToEmail);
msgobj.From = new MailAddress("xxxxx@hotmail.com");
msgobj.Body = obj.EMailBody;
msgobj.Subject = obj.EmailSubject;
msgobj.CC.Add(obj.EmailCC);
msgobj.Bcc.Add(obj.EmailBCC);

if (obj.imageFile != null && obj.imageFile.ContentLength > 0)
{
    msgobj.Attachments.Add(new Attachment(obj.imageFile.InputStream, obj.imageFile.FileName));
}

client.Send(msgobj);
0 голосов
/ 30 октября 2018

вы должны изменить

 @using (Html.BeginForm()) 

с

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

Что означает enctype = 'multipart / form-data'?

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