我是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);
}
我应该如何处理此共享代码,因此我不需要继续复制它?
由于
答案 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管道中运行,并且您的主操作不需要知道这个常见的共享逻辑。