gpt4 book ai didi

c# - 在 MVC 的每个页面上放置重复出现的代码的正确位置是什么

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:04 25 4
gpt4 key购买 nike

在我的 mvc 解决方案中,我最初使用 viewModel 来保存 SelectListItems 的 IEnumerable。这些将用于填充如下所示的 dropdownfor 元素

 @Html.DropDownListFor(model => model.Type, Model.PrimaryTypeList, new { data_acc_type = "account", data_old = Model.Type, @class = "js-primary-account-type" })

问题是每当我不得不返回这个 View 时,列表都需要重新填充一些非常繁重的东西,如下所示:

if(!ModelState.IsValid){
using (var typeRepo = new AccountTypeRepository())
{

var primTypes = typeRepo.GetAccountTypes();
var primtype = primTypes.SingleOrDefault(type => type.Text == model.Type);
model.PrimaryTypeList =
primTypes
.Select(type => new SelectListItem()
{
Value = type.Text,
Text = type.Text
}).ToList();

}
return View(model);
}

每次回发都必须重写甚至重新调用(如果放入方法中)相同的代码对我来说似乎很愚蠢。 - 这同样适用于 ViewBag,因为由于继承和我的页面布局,我有大约 6 个 Controller 调用相同的 View 。

目前我选择将调用实际放在我的 Razor 中。但这感觉不对,更像是老式的 asp。如下图

@{
ViewBag.Title = "Edit Account " + Model.Name;

List<SelectListItem> primaryTypes = null;
using (var typeRepo = new AccountTypeRepository())
{
primaryTypes =
typeRepo.GetAccountTypes()
.Select(t => new SelectListItem()
{
Value = t.Text,
Text = t.Text
}).ToList();
}
@Html.DropDownListFor(model => model.Type, primaryTypes, new { data_acc_type = "account", data_old = Model.Type, @class = "js-primary-account-type" })

没有使用一些完全奇怪的东西。有没有更好的方法来解决这种情况?

更新:虽然半接受下面@Dawood Awan 的回答。我的代码稍微好一些,虽然仍在 View 中,但我仍然 100% 对其他人的想法或答案持开放态度。

当前代码(Razor 和 Controller )

  public static List<SelectListItem> GetPrimaryListItems(List<AccountType> types)
{
return types.Select(t => new SelectListItem() { Text = t.Text, Value = t.Text }).ToList();
}
public static List<SelectListItem> GetSecondaryListItems(AccountType type)
{
return type == null?new List<SelectListItem>(): type.AccountSubTypes.Select(t => new SelectListItem() { Text = t.Text, Value = t.Text }).ToList();
}

@{
ViewBag.Title = "Add New Account";
List<SelectListItem> secondaryTypes = null;
List<SelectListItem> primaryTypes = null;
using (var typeRepo = new AccountTypeRepository())
{
var primTypes = typeRepo.GetAccountTypes();
primaryTypes = AccountController.GetPrimaryListItems(primTypes);
secondaryTypes = AccountController.GetSecondaryListItems(primTypes.SingleOrDefault(t => t.Text == Model.Type));
}

}

最佳答案

在实践中,您需要分析您的应用程序运行缓慢的地方,并首先加快这些部分。

对于初学者来说,将任何类似的代码从 View 中取出并放回 Controller 中。使用 ViewModel 的开销可以忽略不计(速度方面)。最好将所有决策/数据获取代码都放在 Controller 中,而不是污染 View ( View 应该只知道如何呈现特定“形状”的数据,而不是数据的来源)。

你的“东西很重”的评论是相当武断的。例如,如果该查询在 Azure 托管网站上跨 1Gb 连接运行,您将不会注意到或关心太多。数据库缓存也将启动以提升它。

话虽如此,这实际上只是一个缓存问题,决定在哪里缓存它。如果数据对所有用户都是通用的,则静态属性(例如在 Controller 中或全局存储)将提供对该静态列表的快速内存重用。

如果数据频繁更改,您将需要提供刷新内存缓存的功能。

如果您使用 IOC/注入(inject),您可以指定在所有请求之间共享的单个静态实例。

不要使用每 session 数据来存储静态信息。这会减慢系统速度,并会因大量用户而耗尽内存(即无法很好地扩展)。

关于c# - 在 MVC 的每个页面上放置重复出现的代码的正确位置是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com