ASP.NET MVC View需要显示来自特定模型的数据,同时获取另一个模型的输入数据

时间:2017-09-27 19:53:16

标签: c# asp.net-core asp.net-core-mvc

我有一个View,它使用动态对象从ViewModel中声明的多个模型中提取数据。但是,在同一个模型中,我试图通过表单获取用户输入。正确显示2个模型的数据,这两个模型也是动态对象的一部分。但我不成功获取表单输入,因为我不断收到动态对象无法访问的错误。[这只适用于表单。]

以下是View的外观

 @model dynamic
 @using ActionAugerMVC.ViewModels
 @addTagHelper "*,Microsoft.AspNetCore.Mvc.TagHelpers"
 <div class="course__title">
        @Model.item.PageTitle
 </div>


  <p class="course__desc">
         @Html.Raw(Model.item.PageText)
  </p>
  <div class="event__price">
        <h3>@Model.item.NoticeTitle</h3>
         <p>@Model.item.NoticeNeedItem</p>
         <button type="submit" class="btn btn-accent">
                        Get A Quote Now
         </button>
   </div>

   <h3 class="course_desc__title">Other Services</h3>
   <ul class="course_requirements__list multi-column">
    @foreach (var link in Model.data)
     {
       <li><i class="ion-android-arrow-forward"></i>  @Html.ActionLink((string)link.PageTitle, "Page", "Plumbing", new { id = link.ID, url = link.PageURL }) </li>
     }

   </ul>

  <div class="sidebar__item">
                        <p class="subheading">Instant Quote Request</p>
                        <form class="register__form" role="form" asp-controller="Plumbing" asp-action="Page" method="post">
                            <div class="text-danger" asp-validation-summary="All"></div>
                            <div class="form-group">

                                <label class="sr-only">Full Name </label>
                                 <input asp-for="@Model.quote.FullName" type="text" class="form-control" placeholder="Full name">
                            </div>
                         <div class="form-group">
                                <label class="sr-only">Your phone</label>
                                <input asp-for="@Model.quote.Phone" type="tel" class="form-control" placeholder="Your phone">
                                <span asp-validation-for="@Model.quote.Phone" class="text-danger"></span>
                            </div>
                            <div class="form-group">
                                <label class="sr-only">E-mail</label>
                                <input asp-for="@Model.quote.Email" type="email" class="form-control" placeholder="E-mail">
                                <span asp-validation-for="@Model.quote.Email" class="text-danger"></span>
                            </div>
                            <div class="form-group">
                                <label class="sr-only">Your Message</label>
                                <input asp-for="@Model.quote.Message" type="text" class="form-control" placeholder="Your Message">
                            </div>
                            <input type="submit" value="Get a Quote Now" class="btn btn-accent btn-block">


                        </form>
 </div> <!-- .sidebar__item -->

以下是控制器的外观: -

    public class PlumbingController : Controller
{
    private readonly ActionAugerDataContext actionAugerDbContext;
    private readonly UnitOfWork unitOfWork;
    private readonly PlumbingPageViewModel plumbingViewModel;



    public PlumbingController(ActionAugerDataContext context)
    {
        actionAugerDbContext = context;
        unitOfWork = new UnitOfWork(actionAugerDbContext);
        plumbingViewModel = new PlumbingPageViewModel(unitOfWork);
    }

    // GET: /<controller>/
    public IActionResult Index()
    {
        var data = plumbingViewModel.PlumbingContent;
        return View(data);
    }

    [HttpGet]
    [Route("plumbing/calgary-{url}")]
    public IActionResult Page(int ID, string url)
    {
        dynamic Page = new ExpandoObject();
        Page.item = unitOfWork.ContentRepository.GetById(ID);
        Page.data = plumbingViewModel.PlumbingContent;
        Page.cities = plumbingViewModel.Cities;
     //   Page.quote = plumbingViewModel.Quote;
        return View(Page);
    }

    [HttpPost]
    public IActionResult Page(Quote quote)
    {
        return View();
    }
}

以下是视图模型: -

   public class PlumbingPageViewModel
   {
     public IEnumerable<Content> PlumbingContent { get; set; }
     public IEnumerable<Cities> Cities { get; set; }
     public Quote Quote { get; set; }

    public PlumbingPageViewModel(UnitOfWork unitOfWork)
    {
        PlumbingContent = unitOfWork.ContentRepository
            .GetAll()
            .Where(d => d.Section == "Plumbing")
            .Where(c => c.City == "Calgary");
        Cities = unitOfWork.CitiesRepository
            .GetAll()
            .Where(c => c.HomeCity == "Calgary");

     }
 }

这是表单的模型类。

   public class Quote
   {
     public int ID { get; set; }
     public string FullName { get; set; }
     public string Phone { get; set; }
     public string Email { get; set; }
     public string City { get; set; }
     public string Message { get; set; }
   }

1 个答案:

答案 0 :(得分:0)

您不能使用动态模型(@model dynamic)来使用HtmlHelper构建表单

如果你想要Post形式,你应该具体模特。

希望你能这样做。