嘿嘿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的返回值时,它的值为 null 。
那么我会做错什么?我在这里和那里设置了一些停靠点,并注意它从不调用 allTips()功能,因此这是一个很好的起点,我需要做什么才能做到这一点。
我只是认为调用 .getTips 会触发 theTips 函数?
答案 0 :(得分:4)
您似乎在模型中将构造函数与属性混淆,这非常奇怪。我怀疑你想要这样的东西:
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
属性。这是在该对象的构造函数中初始化的。
请注意,这些都与MVC无关,这只是在C#中创建一个对象并在该对象上使用属性。
另请注意,我在这里更改了一些名称。在C#类中,名称应以大写字母开头。此外,您不想打电话给所有&#34;提示&#34; (而且你不想打电话给任何事情&#34; blah&#34;)。使用有意义且直观的名称可以使您的代码更易于理解,这有助于您了解自己的写作内容。
答案 1 :(得分:3)
你误解了setter
的概念并将其用作&#34;初始化器&#34;,设置器用于设置值,用其他词来改变它。如果你想初始化它,请在构造函数中执行它。
这里你使用了两个不同的列表,我不知道为什么。 一个有效的代码是:
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])
答案 2 :(得分:1)
更改您的模型,如下所示:
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();
答案 3 :(得分:1)
这里有一些问题,但我会直接回答你的问题...... ViewBag.pageTips [1]为空的原因是因为你从未初始化模型中的_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]