0

我有一个名为“GetInTouch”(联系我们表格)的模型及其控制器,并查看所有工作正常。

我的问题是,当应用程序加载时,它有一个“主页/登陆页面”,我需要在有一个“HomeController”的登陆页面上显示这个“GetInTouch”视图,而不是将它作为一个单独的页面。因此,在从着陆页“提交”时,它应该转到“GetInTouchController”并处理数据(保存和发送电子邮件),但它返回 null。

这是 GetInTouch 模型

   public class GetInTouch
    {
        [Key]
        public int Id { get; set; }       
        [Display(Name = "Your Name")]
        public string YourName { get; set; }
      
        [Display(Name = "Email Address")]
        public string EmailAddress { get; set; }       
       
        [Display(Name = "Your Message")]
        public string YourMessage { get; set; }
    }

这是 GetInTouchController

public async Task<IActionResult> Create(GetInTouch intouch)
    {
       if (ModelState.IsValid)
        {
            _GetInTouch.GetInTouch.Add(intouch);              
            await _GetInTouch.SaveChangesAsync();
            //await _emailService.SendTestEmail(options);
            return RedirectToAction(nameof(Create), new { isSuccess = true, sendId = intouch.Id });
        }
        return View(intouch.Id);            
    }

和 GetInTouch 视图

 @model project.Models.GetInTouch
<div class="container">
    <h3 class="display-4">Get In Touch</h3>
    <hr />
    @if (ViewBag.IsSuccess == true)
    {
        <div class="alert alert-success alert-dismissible fade show" role="alert">
            <strong>Thank You for your enquiry!</strong> We'll be in touch with you asap <br />
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>
    }

     <div class="row mt-5">
        <div class="col-sm-12 col-md-12">
            <h2 class="section-heading text-primary text-center no-after mb-4">
                Contact Us
            </h2>
            <form method="post" class="form-contact" autocomplete="nope" id="contactForm" data-toggle="validator" asp-action="Create" asp-controller="GetInTouch">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="row">
                    <div class="col-sm-6 col-md-6">
                        <div class="form-group">
                            <input type="text" asp-for="YourName" autocomplete="nope" class="form-control" id="p_name" placeholder="Your Name" required="">
                            <span asp-validation-for="YourName" class="text-danger"></span>
                        </div>
                    </div>
                    <div class="col-sm-6 col-md-6">
                        <div class="form-group">
                            <input type="email" asp-for="EmailAddress" autocomplete="new_email" class="form-control" id="p_email" placeholder="Your Email" required="">
                            <span asp-validation-for="EmailAddress" class="text-danger"></span>
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <textarea id="p_message"  asp-for="YourMessage" class="form-control" rows="6" autocomplete="nope" placeholder="Your Message"></textarea>
                    <span asp-validation-for="YourMessage" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <div class="text-center">
                        <div id="success"></div>                       
                        <input type="submit" value="SEND" class="btn btn-primary" />
                    </div>

                </div>
            </form>
        </div>
    </div>
</div

上面的代码工作正常,现在我想做的是在另一个视图中将这个“表单/视图”显示为一个部分(就在页脚之前),比如主页索引视图,但是当用户点击“发送”时,它当然应该去给GetInTouchController 创建动作和流程。

因此,我将视图从 GetInTouch 创建视图复制到页脚之前的主页索引视图,但主页/视图有一个视图模型名称“indexViewModel”,它列出了来自另一个模型的数据,但我知道你只能将一个模型传递给一个视图(所以没有办法说@model project.Model.GetInTouch,而是我在主页中有@model IndexViewModel)所以我想要的只是一旦用户完成表单并从主页视图中点击“发送”它就会转到'GetInTouchController' 创建操作并保存输入到 GetInTouch 模型中的所有详细信息并发送电子邮件(我有电子邮件功能)只需要保存数据,因为它全部返回为空。这是 IndexViewModel

 public class IndexViewModel
    {       
        //public IEnumerable<CategoryVM> Category { get; set; }
        public GetInTouch GetInTouch { get; set; }
    }

我不知道如何继续,我尝试将确切的 create 方法复制到 HomeController 并将表单指向 HomeController Create 操作,但这也不起作用 - 知道如何在另一个视图中处理表单吗?很抱歉它很长,但需要解释我想要实现的目标,希望它很清楚,并感谢您的时间。

4

1 回答 1

1

据我所知,如果你想从另一个视图发布数据,你可以在新视图中设置表单标签。

它将根据输入标签生成表单数据并发布到 GetInTouch 视图。

更多细节,您可以参考下面的测试演示。

注意:您应该在输入标签中设置名称以匹配 GetInTouch 控制器:

将以下表格放入索引视图中:

索引视图模型:

public class IndexViewModel
{
    public GetInTouch GetInTouch { get; set; }

}

看法:

<form method="post" class="form-contact" autocomplete="nope" id="contactForm" data-toggle="validator" asp-action="Create" asp-controller="GetInTouch">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="row">
        <div class="col-sm-6 col-md-6">
            <div class="form-group">
                <input type="text" asp-for="GetInTouch.YourName" name="YourName" autocomplete="nope" class="form-control" id="p_name" placeholder="Your Name" required="">
                <span asp-validation-for="GetInTouch.YourName" class="text-danger"></span>
            </div>
        </div>
        <div class="col-sm-6 col-md-6">
            <div class="form-group">
                <input type="email" asp-for="GetInTouch.EmailAddress" name="EmailAddress"  autocomplete="new_email" class="form-control" id="p_email" placeholder="Your Email" required="">
                <span asp-validation-for="GetInTouch.EmailAddress" class="text-danger"></span>
            </div>
        </div>
    </div>
    <div class="form-group">
        <textarea id="p_message" asp-for="GetInTouch.YourMessage" name="YourMessage" class="form-control" rows="6" autocomplete="nope" placeholder="Your Message"></textarea>
        <span asp-validation-for="GetInTouch.YourMessage" class="text-danger"></span>
    </div>
    <div class="form-group">
        <div class="text-center">
            <div id="success"></div>
            <input type="submit" value="SEND" class="btn btn-primary" />
        </div>

    </div>
</form>

结果:

在此处输入图像描述

于 2021-03-30T07:37:14.727 回答