【问题标题】:Partial view send null value to model even text fields are filled即使填充了文本字段,部分视图也会向模型发送空值
【发布时间】:2020-10-26 12:12:42
【问题描述】:

我有我的主页索引,用于显示应用程序的各个部分。它包含许多局部视图。我在局部视图上显示数据没有问题,但是当我尝试使我的局部视图之一执行诸如搜索项目之类的操作时。我有搜索部分视图,它需要输入街道名称、国家/地区来显示属性列表。

我的索引使用 viewModel 之类的

public class HomeViewModel
{
    public List<Ads> Ads { get; set; }
    public AdsImage AdsImages { get; set; }
    public List<Category> Category { get; set; }
    public List<City> Cities { get; set; }
    public List<County> Counties { get; set; }


    //ViewModel for _AdSeach paritrial view.
    public Search Search { get; set; }
}

我的搜索部分将使用 HomeViewModel 显示文本字段,但在此部分视图中它将使用其他控制器来触发数据。它不会使用家庭控制器,但会使用带有 SearchAds 操作的广告控制器。我的局部视图将如下所示。

<div class="row">
    <div class="col-sm-3">
        @Html.TextBoxFor(m => m.Search.Category, new { placeholder = "Category", @class = "form-control" })
        @Html.ValidationMessageFor(m => m.Search.Category)
    </div>
    <div class="col-sm-3">
        @Html.TextBoxFor(m => m.Search.City, new { placeholder = "City", @class = "form-control" })
        @Html.ValidationMessageFor(m => m.Search.City)
    </div>
    <div class="col-sm-3">
        @Html.TextBoxFor(m => m.Search.County, new { placeholder = "County", @class = "form-control" })
        @Html.ValidationMessageFor(m => m.Search.County)
    </div>
    <div class="col-sm-2">
        <button type="submit" class="btn btn-primary">ค้นหา</button>
    </div>
</div>

在我的主页索引中将使用 Kaiban.ViewModel.HomeViewModel 像这样进行局部视图渲染

@Html.Partial("_AdsSearch", Model.Search)

在我的 Seach 模型中,它用于处理将从部分视图发送的数据,业务逻辑如下所示。

[NotMapped]
public class Search
{
    public int? Id { get; set; }
    public string Category { get; set; }
    public string City { get; set; }
    public string County { get; set; }



}
[NotMapped]
public class ProductBusinessLogic
{
    private ApplicationDbContext Context;
    public ProductBusinessLogic()
    {
        Context = new ApplicationDbContext();
    }


    //คลาสที่ใช้ในการค้นหารายชื่อโฆษณา
    public IQueryable<Ads> GetProducts(Search searchModel)
    {
        var result = Context.Adses.AsQueryable();
        if (searchModel != null)
        {
            if (searchModel.Id.HasValue)
                result = result.Where(x => x.Id == searchModel.Id);

            //เช็คว่า SreetName มีค่ส่งมาหรือปล่าวเเล้ว ค้นหาจากฐานข้อมูลโดยกำหนด StreetName ของ Search Model ตรงกับชื่อถนนไหนบ้างในฐานข้อมูล;
            if (!string.IsNullOrEmpty(searchModel.Category))
                result = result.Where(x => x.Category.Name.Contains(searchModel.Category));

            if (!string.IsNullOrEmpty(searchModel.County))
                result = result.Where(x => x.County.Name.Contains(searchModel.County));

            if (!string.IsNullOrEmpty(searchModel.City))
                result = result.Where(x => x.City.Name.Contains(searchModel.City));
        }
        return result;
    }
}

这是我的广告控制器

public ActionResult SearchAds(Search searchModel)
    {
        var business = new ProductBusinessLogic();
        var model = business.GetProducts(searchModel);
        return View(model);
    }

当我在局部视图上提交按钮时,我的模型以某种方式收到空值。即使我在部分视图中输入所有字段。

我仍然不知道为什么它会收到 null。有人可以帮我解决这个问题。以及是否有人可以让我更好地了解视图和模型如何用于发送和接收数据。

提前感谢您的帮助:)

【问题讨论】:

  • 在您的问题中,请包含从搜索提交按钮接收Post 的控制器方法。
  • 您好,我已经添加了我的广告控制器,请您看看。

标签: asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

你的局部模型声明是什么?

@Html.Partial("_AdsSearch", Model.Search),您似乎将Search 模型而不是HomeViewModel 传递给部分,但是从您如何将模型属性绑定到输入,即@Html.TextBoxFor(m =&gt; m.Search.Category),看起来像您'正在传递HomeViewModel

尝试将您部分的模型声明更改为:

@model Search

<div class="row">
    ...

【讨论】:

  • 我在我的主页索引中使用了 HomeViewModel,当我尝试传递另一个模型“搜索”时,它会出现异常。我将 @Html.Partial("_AdsSearch", Model.Search) 更改为 @Html.Partial("_AdsSearch", Model) 但并确保所有内容都通过 HomeViewModel。我仍然得到空值。
  • @TsubagiYoshino:异常信息是什么?您应该将其发布到您的 OP。您应该只将 Search 模型传递给您的部分,并且您需要更改将其属性绑定到内部输入的方式,即从 @Html.TextBoxFor(m => m.Search.Category) 到 @Html.TextBoxFor( m => m.Category)。
  • 您好,我已经解决了我的问题,感谢您的帮助。我得到的错误是传递搜索模型,但应用程序需要 HomeViewModel 模型。
【解决方案2】:

我刚刚通过使用这个部分助手找到了解决方案

在我之前的渲染中,我尝试使用相同的 ViewModel,即 HomeViewModel,并将所有内容传递给该模型。我认为这是显示我的部分首页索引的唯一方法。

有了这段代码,我可以使用来自不同模型的部分。

@Html.Partial("_AdsSearch", new Kaiban.Models.Search())

在我的部分视图中,我将模型更改为 application.model.Search 而不是 application.viewModel.HomeViewModel 并且与

@Html.TextBoxFor(m => m.Search.City)

@Html.TextBoxFor(m => m.City)

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2021-03-12
    相关资源
    最近更新 更多