5

目标

根据预期更改模型。

问题

我的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>——我不知道该怎么做。

我已经尝试过的

像这样的东西:

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

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

4

2 回答 2

4

一个视图实际上应该只有一个模型,所以试图让一个视图使用两个不同的模型,虽然可行,但不应该这样做。

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

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

return View("DailyOffers", productsList);

但是,如果不是这样做,在 DailyOffers 的情况下重定向到不同的操作是否更有意义?所以,你有一个新的行动:

public ActionResult DailyOffers(...)

而不是return View(productsList)你这样做:

return RedirectToAction("DailyOffers");

这一切都假设模型彼此之间有足够的不同。如果它们相似,则使用 pswg 建议的接口解决方案会更有意义。

于 2013-06-14T20:36:13.527 回答
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>
于 2013-06-14T20:38:24.957 回答