调用 属性 填充模型

call property to populate in model

大家好,我是 MVC 世界的新手,所以我确定我没有做正确的事情。我正在尝试从我的视图索引页面的模型页面调用一个函数来填充一些工具提示。

在我的模型中:

public class tips
{
    public List<string> allTips()
    {
        List<string> theTips = new List<string>();

        theTips.Add("example 1");
        theTips.Add("example 2");

        return theTips;
    }

    private List<string> _tips;
    public List<string> getTips { get { return _tips; } set { _tips = allTips(); } }
}

在我看来:

public ActionResult Index()
{
    var blah = new tips().getTips;

    ViewBag.pageTips = blah;

    return getMainData();
}

然后我在剃须刀页面上有这个:

@Html.Raw(ViewBag.pageTips[1])

应该在页面上显示 示例 2,但它只显示 null 作为工具提示的值。

当前,当它到达我认为的 pageTips 的 return 时,它的值为 null

那么我做错了什么?我在这里和那里停下来,注意到它从不调用 allTips() 函数,因此这是我需要做些什么的一个很好的起点。

我只是认为调用 .getTips 会触发 theTips 函数?

您误解了 setter 的概念并将其用作 "initializer",setter 的意思是设置值,换句话说就是更改它。如果你想初始化它,请在构造函数中进行。

你在这里使用了两个不同的列表,我真的不知道为什么。 一个工作代码是:

public class tips
{
    public tips()
    {
        _tips = new List<string>();

        _tips.Add("example 1");
        _tips.Add("example 2");
    }

    private List<string> _tips;
    public List<string> getTips { get { return _tips; } set { _tips = value; } }
}

然后在控制器中:

ViewBag.pageTips = new tips().getTips;

然后在视图中这样调用:

@Html.Raw(ViewBag.pageTips[1])

您似乎混淆了模型中的 constructorsproperties,这很奇怪。我怀疑你想要这样的东西:

public class TipsObj
{
    // a property
    public List<string> Tips { get; set; }

    // a constructor
    public TipsObj()
    {
        Tips = new List<string>();

        Tips.Add("example 1");
        Tips.Add("example 2");
    }
}

这里的想法是,当您创建对象的新实例时,默认 调用构造函数,因此您的Tips 属性 将自动只需创建一个实例即可立即填充。

然后在您的控制器操作中,您可以简单地执行此操作:

var tips = new TipsObj();

ViewBag.pageTips = tips.Tips;

这将创建 TipsObj 的实例并将 ViewBag 属性 设置为该实例的 Tips 属性。这是在该对象的构造函数中初始化的。

请注意,none 这实际上与 MVC 有任何关系,这只是在 C# 中创建一个对象并在该对象上使用 属性。

另请注意,我在这里更改了一些名称。在 C# class 中,名称应以大写字母开头。此外,您不想调用 everything "tips"(并且您不想调用 anything "blah" ).使用有意义且直观的名称可以让您的代码更易于理解,这将有助于您理解您正在编写的内容。

按如下方式更改您的模型:

public class Tips
{
    private List<string> _tips {get; set;}

    public Tips()
    {
        _tips = new List<string>();
        _tips.Add("example 1");
        _tips.Add("example 2");
    }

    public List<string> getTips() 
    { 
        return _tips;
    }
}

那就用吧:

ViewBag.pageTips = new Tips().getTips();

这里有一些问题,但我将从直接回答您的问题开始... ViewBag.pageTips[1] 为 null 的原因是您从未在模型中初始化 _tips 数组。唯一能做到这一点的代码在 getTips 属性 的 setter 中,它永远不会被调用。如果你附加一个调试器,它会很明显:)

您可以通过几种方式重构它,包括将 allTips() 方法更改为构造函数,并在那里初始化您的集合。

不过我不想直接举个例子。您提到您是 MVC 的新手,所以我想向您展示应该如何真正做到这一点。 MVC 的一大好处是模型绑定,所以忘记 ViewBag。 试试这个:

模特

using System.Collections.Generic;

namespace WebApplication1.Models
{
    public class TipsModel
    {
        public List<string> Tips { get; }

        public TipsModel()
        {
            Tips = new List<string> {"example 1", "example 2"};
        }
    }
}

控制器

    public ActionResult Index()
    {
        var model = new TipsModel();

        return View(model);
    }

景色

@model WebApplication1.Models.TipsModel

@{
    ViewBag.Title = "Index";
}

@Model.Tips[1]