根据视图中的预期设置模型

时间:2013-06-14 20:31:24

标签: c# asp.net-mvc-4 razor

目标

根据期望值改变模型。

问题

我的ProductsController中有一个名为Category的方法。当有人请求此方法时,会发生两件事 :如果传递给方法的参数与Daily-Offers不同,则会将一种类型的列表传递给View。如果传递给方法的参数等于Daily-Offers,则将另一种类型的列表传递给View。

为了更好地理解,请参阅:

[HttpGet]
public ActionResult Category(string categoryName = null)
{
    int? categoryId = categoryName != "Daily-Offers" ? 
                      Convert.ToInt32(Regex.Match(categoryName, @"\d+").Value) :
                      (int?)null;

    if (categoryName == "Daily-Offers")
    {
        var productsList = Products.BuildOffersList();
        ViewBag.Title = String.Format("Today's deal: ({0})", DateTime.Now);
        ViewBag.CategoryProductsQuantity = productsList.Count;
        ViewBag.CurrentCategory = "Daily-Offers";
        return View(productsList);
    }
    else if (Regex.Match(categoryName, @"\d+").Success && 
             String.Format("{0}-{1}", 
             categoryId, 
             CommodityHelpers.UppercaseFirst
                (CommodityHelpers.GenerateSlug
                     (Categories.GetDetails((sbyte)categoryId).Category_Name))) 
            == categoryName)
    {
        ViewBag.Title = Categories.GetDetails((sbyte)categoryId).Category_Name;
        ViewBag.CategoryProductsQuantity = 
        Categories.GetDetails((sbyte)categoryId).Category_Products_Quantity;
        ViewBag.CurrentCategory = 
           CommodityHelpers.UppercaseFirst(CommodityHelpers.GenerateSlug
           (Categories.GetDetails((sbyte)categoryId).Category_Name));
        return View(Products.BuildListForHome(categoryId, null));
    }
    else
    {
        return View("404");
    }
}

正如您所看到的,视图应准备好接收IList<Offers>或/和IList<NormalProducts> - ,我不知道如何执行此操作。 < / strong>

我已经尝试了什么

这样的事情:

@model if(IEnumerable<BluMercados.Models.Data.getProductsListForHome_Result>) 
       ?: (IEnumerable<BluMercados.Models.Data.getProductsInOfferList_Result>);

但是,当然没有成功。只是为了说明。

2 个答案:

答案 0 :(得分:4)

一个视图应该只有一个模型,所以尝试使视图消耗两个不同的模型,虽然可行,但是不应该这样做。

相反,您可以创建不同的视图。假设您为DailyOffers创建一个新视图,它以IEnumerable<Offers>为模型。

然后,您可以使用View()的重载来指定要返回的视图:

return View("DailyOffers", productsList);

但是,在DailyOffers的情况下,重定向到不同的操作更有意义吗?所以,你有一个新动作:

public ActionResult DailyOffers(...)

而不是return View(productsList)

return RedirectToAction("DailyOffers");

这一切都假设模型彼此之间存在很大差异。如果它们相似,请使用p.s.w.g建议的接口解决方案。会更有意义。

答案 1 :(得分:4)

我认为你不能这样做,即使你可以,也不是一个好习惯。如果每个模型的视图非常相似,我建议为OffersNormalProducts创建一个通用界面

public interface IProduct
{
    // common properties ...
}

public class Offer : IProduct
{
    // ...
}

public class NormalProduct : IProduct
{
    // ...
}

然后在您的视图中使用

@model IEnumerable<IProduct>

如果您对每个模型的视图有很大不同,我强烈建议将它们分成不同的视图,并在控制器中进行决策:

if (categoryName == "Daily-Offers")
{
    ...
    return View("Category_Offers", productsList);
}
else if (...)
{
    ...
    return View("Category_NormalProducts", Products.BuildListForHome(categoryId, null));
}

然后在您的视图中使用

// Category_Offers.cshtml
@model IEnumerable<Offer>

// Category_NormalProducts.cshtml
@model IEnumerable<NormalProduct>