【问题标题】:Data from model not passing to view模型中的数据未传递到视图
【发布时间】:2016-04-25 21:29:55
【问题描述】:

我有一些运行异常的代码,想知道是否有其他人遇到过这个问题。

我有一个视图模型,它通过存储过程和 vb 对象从数据库中收集数据(不,我不知道 vb 这是遗留的)

当我执行程序时,数据会通过控制器按预期收集。当我调试它时,我可以看到我的所有参数都填充了信息。但是,当涉及到视图时,它说参数为空。我已经包含了我的代码

型号:

    public class PersonIncomeViewModel
{
    public string IncomeTypeDesc { get; set; }
    public string IncomeDesc { get; set; }
    public string Income { get; set; }
}

public class PersonIncomeListViewModel
{
    public int? PersonId { get; set; }
    public List<PersonIncomeListItem> Incomes { get; set; }

    public PersonIncomeListViewModel()
    {
        Incomes = new List<PersonIncomeListItem>();
    }
}

    public class PersonLookupViewModel : Queue.QueueViewModel
{
    public int Action { get; set; }
    public bool ShowAdvancedFilters { get; set; }

    //Person Search Variables
    [Display(Name = @"Search")]
    public string SpecialSearch { get; set; }
    [Display(Name = @"Person Id")]
    public int? PersonId { get; set; }
    [Display(Name = @"Full Name")]
    public string FullName { get; set; }
    [Display(Name = @"SSN")]
    public string SSN { get; set; }
    public string AddressStatus { get; set; }
    public string EmploymentStatus { get; set; }

    public PersonIncomeViewModel Income { get; set; }
    public List<PersonIncomeListItem> Incomes { get; set; } 



    public PersonLookupViewModel()
    {

        Income = new PersonIncomeViewModel();
        Incomes = new List<PersonIncomeListItem>();

    }

}

控制器:

public ActionResult _Income(int id)
    {
        var vm = new PersonLookupViewModel();

        var personManager = new dtPerson_v10_r1.Manager( ref mobjSecurity);

        //var person = personManager.GetPersonObject((int)id, vIncludeIncomes: true);
        var person = personManager.GetPersonObject(id, vIncludeIncomes: true);

        var look = JsonConvert.SerializeObject(person.Incomes);

        foreach (dtPerson_v10_r1.Income income in person.Incomes)
        {

            if (income.IncomeType_ID == 0)
            {
                var item = new PersonIncomeListItem
                               {
                                   IncomeTypeDesc = "Unknown",
                                   IncomeDesc = income.IncomeDesc,
                                   Income = mobjFormat.FormatObjectToCurrencyString(income.Income)
                               };
                vm.Incomes.Add(item);
            }

            if (income.IncomeType_ID == 1)
            {
                var item = new PersonIncomeListItem
                {
                    IncomeTypeDesc = "Alimony",
                    IncomeDesc = income.IncomeDesc,
                    Income = mobjFormat.FormatObjectToCurrencyString(income.Income)
                };

                vm.Incomes.Add(item);
            }

            if (income.IncomeType_ID == 2)
            {
                var item = new PersonIncomeListItem
                {
                    IncomeTypeDesc = "Child Support",
                    IncomeDesc = income.IncomeDesc,
                    Income = mobjFormat.FormatObjectToCurrencyString(income.Income)
                };

                vm.Incomes.Add(item);
            }

        }

        return PartialView(vm);
    }

查看:

@using dtDataTools_v10_r1
@using ds_iDMS.Models.Person
@model ds_iDMS.Models.Person.PersonLookupViewModel

@{
    var format = new dtDataTools_v10_r1.CustomFormat();

    var newInitials = (Model.Income.IncomeTypeDesc.First().ToString() + Model.Income.IncomeDesc.First().ToString() + Model.Income.Income.First().ToString()).ToUpper();
}    

    using (Html.DSResponsiveRow(numberOfInputs: ExtensionMethods.NumberOfInputs.TwoInputs))
    {
        using (Html.DSCard(ExtensionMethods.Icon.CustomText, iconInitials: newInitials, color: ExtensionMethods.Colors.PrimaryBlue))
        {
            <div>@Model.Income.IncomeTypeDesc</div>
            <div>@Model.Income.IncomeDesc</div>
            <div>@Model.Income.Income</div>
        }
    }

我们已经构建了一些扩展,但它们与问题无关

出错的行是这一行:

var newInitials = (Model.Income.IncomeTypeDesc.First().ToString() + Model.Income.IncomeDesc.First().ToString() + Model.Income.Income.First().ToString())。 ToUpper();

它驱动视图上的所有扩展方法,当我在它上面运行调试器时,所有参数都读取为 null,但是就像我说的,当我运行调试器并在控制器中检查它们时,它们被正确填充。

很抱歉这篇文章很长,但我想确保所有细节都在那里

【问题讨论】:

  • 不明白你在做什么,income不应该是decimal吗?
  • 首先我会尝试将代码移动到普通视图 - 只是为了检查它是否是与 PartialView 相关的问题。其次,我将通过 ViewBag/ViewData 传递对象,以检查对象传递方式是否存在问题或模型是否存在一般问题。 “Queue.QueueViewModel”中的所有属性都有get/set吗?
  • @maltmann - 是的,所有 Queue.QueueViewModel 属性都有正确的获取/设置。我将尝试通过 ViewBag 传递它来检查它。但是,当我在即时窗口中检查它们时,它正在通过,但一切皆有可能:-)
  • @jamiedanq - 我们有转换扩展,因为模型非常庞大。因此,我们只需将模型中的所有内容作为字符串传递,以加快编码速度,然后使用扩展来确保它们的格式正确。
  • @MaximusPrime 你的View name 是什么?

标签: c# asp.net-mvc


【解决方案1】:

这是将Object model 传递给您的Partial View 的方法

return PartialView("YourViewName", vm);

或使用Views 路径

return PartialView("~/YourView.cshtml", vm);

编辑

试着像这样开始你的动作方法

    var vm= new Person();
    vm.PersonLookupViewModel = new PersonLookupViewModel();

【讨论】:

  • 我试过这个 jamiedanq 并收到完全相同的错误。
  • 你需要将vm模型包裹在Person中并通过它
  • 因为Person 封装了PersonLookupViewModel,正如您在View 上显示的那样。如果不是,它将永远是null
  • 希望你知道你也必须改变这一点vm.Incomes.Add(item);
  • 我不认为当我这样做时它不会将 PersonLookupViewModel 识别为 Person 的一部分(它不是)。 PersonLookupViewModel 是我传递的视图模型,而 Person 是 VB 对象。不过,我当然感谢您的帮助。
【解决方案2】:

问题解决了我的一些 vb 对象有问题,让 vb 人员查看它们并修复它们。

感谢大家的帮助

编辑 必须发生的是必须重写 vb 对象,而我的逻辑就像一开始一样好。我将对我的问题的一个回答标记为答案,因为如果它是在没有附加 vb 对象的真正 MVC 中,那将完美地工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多