【问题标题】:Call static function in view mvc在视图 mvc 中调用静态函数
【发布时间】:2013-05-30 02:28:43
【问题描述】:

我正在做一个 mvc 项目,我想在每个页面上显示一个赞助商图片。

但我在将它们显示到每个视图呈现的共享布局页面中时遇到了困难。

我在我的域服务类中创建了一个函数,我在其中搜索学生的学校,因为学校链接到一个国家,而不是学生。 当我得到那个 countryId 时,我会搜索每个广告的 countryId 等于学校的 countryId 的国家。在这种情况下,我会查找该特定广告的赞助商,将它们放入 SponsorList,从该 SponsorList 中选择一个随机赞助商并返回 SponsorCompany(因为我将每个赞助商图像重命名为公司名称)。

现在我想将该函数调用到共享布局中,因此每次页面呈现时,都会为该特定学生显示一个随机的赞助商图像。但我不知道如何调用该函数,因为共享布局没有控制器类。

    public String advertsForCountry()
{
    String studentSchool = finder.getLoggedStudent().SchoolId;
    int studentCountry = db.Schools.Find(studentSchool).CountryId;

    List<Sponsor> sponsorsForStudent = new List<Sponsor>();
    List<Advert> adverts = db.Adverts.ToList();
    foreach(Advert adv in adverts)
    {
        foreach(Country cntry in adv.Countries)
        {
            if(cntry.CountryId == studentCountry)
            {
                sponsorsForStudent.Add(adv.Sponsor);
            }
        }
    }
    Random random = new Random();
    int randomSP = random.Next(0, sponsorsForStudent.Count()-1);
    string sponsorAdvert = sponsorsForStudent.ElementAt(randomSP).SponsorCompany;
    return sponsorAdvert;       
}

抱歉,英语不是我的母语。

【问题讨论】:

  • 考虑做一个子动作。
  • 我的建议是忘记static method,因为它不是正确的MVC 模式,业务模型的逻辑不应该在View 中。创建一个ViewModel,然后返回一个简单的PartialView 绑定到ViewModel

标签: c# asp.net-mvc database layout


【解决方案1】:

扩展@SLaks 的建议;

创建一个标有ChildActionOnlyAttribute 的操作(这可以防止通过常规 HTTP 请求调用它)。这是我网站上的一个例子:

[HttpGet]
[ChildActionOnly]
public ActionResult RandomQuote()
{
    var model = _services.GetRandomQuote();

    return PartialView("_QuoteOfTheMomentWidget", model);
}

通过简单的@Html.Action("randomquote")_Layout 中调用此子操作。

【讨论】:

  • 但是您将代码放在哪个控制器中?因为 _Layout.cshtml 没有控制器。
  • @Gijs 任何控制器都可以工作。例如,我发布的假设操作是在 Home 控制器中定义的,并且 _QuoteOfTheMoment.cshtml 视图存在于 homeshared 文件夹中。如果它位于 WidgetsController 中,则呼叫将调整为 @Html.Action("randomquote", "widgets")
  • 我正在实施您的解决方案,但收到错误“{“路径'/'的控制器未找到或未实施 IController。”}' 我想我在这里找到了解决方案:@987654321 @ 但我不在这些领域工作,这个功能必须对每个人都有效。
  • @Gijs 发布您尝试使用的内容 - 听起来您使用的 view 参数语法不正确。
【解决方案2】:

创建一个返回局部视图的控制器动作。

public PartialViewResult SponsoredAdvert()
{
    var model = new SponsoredAdverModel();
    model.AdvertText = _domainService.advertsForCountry();
    return PartialView("myView", model);
}

将方法放在合适的控制器中(HomeController 会很有意义,因为它适用于您的 Layout.cshtml)并在您的视图中使用 RenderAction

@Html.RenderAction("MyAction", "MyController")

如您所见,RenderAction 允许您指定控制器,这意味着您可以在 Layout.cshtml 中使用它,即使它本身并不与特定的控制器。

【讨论】:

  • 我不是在 homecontroller 视图中调用该方法,而是在共享的 _layout.cshtm 视图中调用该方法。这包含我的导航栏等并且没有控制器。如果我把它放在主控制器中,这只会在主页上工作。
  • 不,不会。正如我在回答中所描述的,RenderAction 采用controller 参数,它允许您指定哪个控制器类包含操作方法MyAction。您可以使用它将任何控制器的 PartialViewResults 呈现到任何视图中 - 包括来自 Layout.cshtml。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多