您可以向视图发送不同的视图模型吗?

时间:2011-02-04 02:43:21

标签: c# asp.net asp.net-mvc-2 view viewmodel

说我正在为食物实施一个观点。 (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,我如何控制逻辑显示或不在视图中显示某些内容?

3 个答案:

答案 0 :(得分:3)

如果您将FoodViewModel定义为基类,并FruitViewModelVegetableViewModel扩展它,则可以ViewPage<FoodViewModel>并传入。然后,您的视图可以检查它获得的特定子类并呈现适当的输出。

或者,如果FruitViewModelVegetableViewModel之间的唯一区别是一个是Fruit而另一个是Vegetable(但所有其他属性都是共享的,即Name, Calories, Color, Cost),则有{共享FoodType上的{1}}属性,并使用它来有条件地呈现适当的输出。

答案 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", ...)时一样。

备选方案2:

FoodViewModelFruitViewModel可以扩展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决定需要显示的内容。

希望这有帮助!