ASP.NET MVC:在哪里放置代码填充共享视图?

时间:2016-08-26 15:36:14

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

我是MVC& amp;的新手来自asp.net webforms背景,所以我仍然发现我有网络形式的心态,我发现很难打破。特别的一个问题是,如何处理我需要填充共享视图的代码?

在asp.net webforms中,假设我的主页上有一个标签。要填充该标签,我需要做的就是将一些代码放入母版页代码隐藏中,引用该母版页的所有页面都会看到它。

但是在MVC中,我不确定共享代码的放置位置。目前,我在调用引用我的共享视图的视图的所有操作上复制了以下代码,因此我可以在共享视图上填充数据:

public ActionResult MyFirstView()
    {
        Account account = _accountRepository.GetAccountByEmail(System.Web.HttpContext.Current.User.Identity.Name);
        List<Campaign> campaigns = new List<Campaign>();
        campaigns = _campaignRepository.GetCampaignsByAccountId(account.AccountId);

        LayoutModel model = new LayoutModel
        {
            AccountId = account.AccountId,
            Email = account.Email,
            Name = account.Name,
            LogoPath = account.LogoPath,
        };

        foreach (Campaign campaign in campaigns)
        {
            model.AddCampaigns(campaign);
        }

        return View(model);
    }

我应该如何处理此共享代码,因此我不需要继续复制它?

由于

2 个答案:

答案 0 :(得分:3)

您可以将共享代码放在方法中。

如果该代码在多个控制器之间共享,那么您可以为您的控制器创建一个基类,并从您的基类派生而不是从void IMUController::setGroundedPR(double p, double r) { Serial.print("Setting IMU ground: "); StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["pitch"] = p; root["roll"] = r; root.printTo(Serial); char buffer[256]; root.printTo(buffer, sizeof(buffer)); Serial.println(); // EEPROM.write(EEPROM_ADDRESS_IMU_GROUNDED, buffer); } double* IMUController::getGroundedPR() { double ret[2] = {0, 0}; StaticJsonBuffer<200> jsonBuffer; uint8_t json_saved = EEPROM.read(EEPROM_ADDRESS_IMU_GROUNDED); char json[] = "asdf"; // convert json_saved to char here JsonObject& root = jsonBuffer.parseObject(json); if(!root.success()) { // return the result ret[0] = (double)root["pitch"]; ret[1] = (double)root["roll"]; return ret; } return ret; }

派生

如果你在所有动作中做同样的事情你可以覆盖Controller,并在那里编写代码。

答案 1 :(得分:1)

您可以使用Child Action。我们的想法是将这个共享代码放在一个特殊的控制器动作中:

@model LayoutModel

...

然后有一个相应的局部视图来显示这个共享视图模型:

_Layout.cshtml

您可以将<div>@Html.Action("MySharedAction", "SomeController")</div> 包含在所需位置:

{{1}}

子操作,即使它在与它隔离的主操作相同的HTTP管道中运行,并且您的主操作不需要知道这个常见的共享逻辑。