说我正在为食物实施一个观点。 (ASP.NET MVC2)
然后根据类型(例如水果或蔬菜),我将更改视图。
我可以在不创建水果和蔬菜的单独视图的情况下这样做吗?
即。假设我们有像http://localhost:xxxx/Food/ {foodID}
这样的网址结构并且不想要
http://localhost:xxxx/Veg/ {foodID}
http://localhost:xxxx/Fruit/ {foodID}
所以我希望能够根据类型更改视图。我正在使用来自telerik的tabtrip控件,让你了解视图中的差异 - 它只是说 - 不显示Veg的一个特定选项卡,例如,如果是水果,则显示它。
视图是否可以接受两种不同的视图模型?所以当我们点击http://localhost:xxxx/Food/ {foodID}时,代码确定对象是什么类型(水果或蔬菜)然后发送FruitViewModel或VegetableViewModel?如果我只发送一个viewmodel,我如何控制逻辑显示或不在视图中显示某些内容?
答案 0 :(得分:3)
如果您将FoodViewModel
定义为基类,并FruitViewModel
和VegetableViewModel
扩展它,则可以ViewPage<FoodViewModel>
并传入。然后,您的视图可以检查它获得的特定子类并呈现适当的输出。
或者,如果FruitViewModel
和VegetableViewModel
之间的唯一区别是一个是Fruit而另一个是Vegetable(但所有其他属性都是共享的,即Name, Calories, Color, Cost
),则有{共享FoodType
上的{1}}属性,并使用它来有条件地呈现适当的输出。
答案 1 :(得分:1)
最佳选择取决于水果和蔬菜观点的差异:
您可以创建两个不同的视图(可以将视图名称传递给View方法):
public ViewResult Food(int id)
{
var food = ...
if (/* determine if food is Veg or Fruit */)
return View("Fruit", new FruitViewModel { ... });
else
return View("Veg", new VegViewModel { ... });
}
通过返回不同的视图,网址不会更改(就像使用隐含HTTP重定向的return RedirectToAction("Action", "Controller", ...)
时一样。
FoodViewModel
和FruitViewModel
可以扩展VegViewModel
。然后,您的FoodView可以是FoodViewModel
类型,并决定在您的查看代码中显示什么。
答案 2 :(得分:1)
如果您需要更改的唯一内容是标签设置。您可以在ViewModel上提供名为“ShowTabItem”的属性,然后将该属性绑定到视图中的TabStripItem。
public class FoodViewModel
{
Food _food;
public FoodViewModel(Food food)
{
}
public bool ShowTabItem
{
get
{
return _food.Type == FoodType.Vegetable;
}
}
}
将ShowTabItem属性绑定到tabstrip项的Visibility或Enabled属性。 (无论如何)
然后你的控制器将只是
public ActionResult Food(int id)
{
Food food = getFood(id);
return View(new FoodViewModel(food));
}
让ViewModel决定需要显示的内容。
希望这有帮助!