根据期望值改变模型。
我的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>);
但是,当然没有成功。只是为了说明。
答案 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)
我认为你不能这样做,即使你可以,也不是一个好习惯。如果每个模型的视图非常相似,我建议为Offers
和NormalProducts
创建一个通用界面
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>