Можете ли вы отправлять разные модели вида? - PullRequest
3 голосов
/ 04 февраля 2011

Скажите, что я реализую представление о еде. (ASP.NET MVC2)

Затем, в зависимости от типа (скажем, фрукт или овощ, например), я буду менять вид.

Могу ли я сделать это без создания отдельного представления для фруктов и овощей?

т.е. Скажем, у нас есть структура URL, как http://localhost:xxxx/Food/{foodID}

и не хочу

http://localhost:xxxx/Veg/{foodID}

http://localhost:xxxx/Fruit/{foodID}

Так что я хочу иметь возможность изменять вид в зависимости от типа. Я использую элемент управления tabstrip от telerik, чтобы дать вам представление о разнице в представлениях - можно сказать, не отображать одну конкретную вкладку для Veg, а отображать ее, например, в виде фруктов.

Может ли представление принимать две разные модели представления? поэтому, когда мы нажимаем http://localhost:xxxx/Food/{foodID}, код определяет тип объекта (Fruit или Vegetable), а затем отправляет FruitViewModel или VegetableViewModel? Если я просто отправлю одну модель представления, как я могу управлять отображением логики или не отображать определенные вещи в представлении?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

Если вы определили FoodViewModel как базовый класс и хотите, чтобы FruitViewModel и VegetableViewModel расширили его, вы могли бы иметь ViewPage<FoodViewModel> и передать либо. Затем ваше представление может проверить, какой конкретный подкласс он получил, и отобразить соответствующий вывод.

В качестве альтернативы, если единственное различие между FruitViewModel и VegetableViewModel состоит в том, что один - это фрукт, а другой - овощ (но все остальные свойства являются общими, то есть Name, Calories, Color, Cost), у общего свойства FoodType на общем FoodViewModel и использовать его для условного рендеринга соответствующего вывода.

1 голос
/ 04 февраля 2011

Если единственное, что вам нужно изменить, это настройка вкладки.Вы можете предоставить свойство «ShowTabItem» в своей ViewModel, а затем связать это свойство с вашим TabStripItem в своем представлении.

public class FoodViewModel
{
    Food _food;

    public FoodViewModel(Food food)
    {

    }

    public bool ShowTabItem
    {
        get
        {
            return _food.Type == FoodType.Vegetable;
        }
    }
}

Привязать свойство ShowTabItem к свойству Visibility или Enabled элемента tabstrip.(что подходит)

тогда ваш контроллер будет просто

public ActionResult Food(int id)    
{
    Food food = getFood(id);
    return View(new FoodViewModel(food));
}

Пусть ваша ViewModel решит, что нужно отображать.

Надеюсь, это поможет!

1 голос
/ 04 февраля 2011

Какая альтернатива является лучшей, зависит от того, насколько различаются виды фруктов и овощей:

Альтернатива 1:

Вы можете создать два разных представления (вы можете передать имя представления методу представления):

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 { ... });
}

При возврате другого представления URL-адрес не изменяется (как это происходит при использовании return RedirectToAction("Action", "Controller", ...), что подразумевает перенаправление HTTP.

Альтернатива 2:

Вы можете иметь общий FoodViewModel, расширенный как FruitViewModel, так и VegViewModel. Тогда ваш FoodView может иметь тип FoodViewModel и решать, что отображать в коде View.

...