我正在尝试构建一组 MVC 组件,这些组件可以通过各种设置轻松重用。它们被构建并用作子操作,因为我需要它们能够在不知道它们所在视图的其他内容的情况下对自己进行部分回发。
我面临一个问题,即在不通过客户端传递参数的情况下将它们存储在哪里(我不想构建视图状态之类的东西,也出于安全原因),并使它们可用于部分回发。
这是一个简化的示例(并不是说代码可能无法编译,因为我削减了语法糖以将其简化为纯 MVC):
查看代码(组件使用):
@Html.Action(
"Default",
"FacebookFeed",
new {
// I don't want this data to pass through client
settings = new FacebookFeedSettings {
AppKey = "XYZ",
AppSecret = "123",
PageSize = 10
}
.ItemTemplate(
@<div class="feed-item">@item.Title</div>
)
}
)
控制器代码:
public class FacebookFeedController {
public ActionResult Default(FacebookFeedSettings settings)
{
// Action code using settings
return PartialView(model);
}
}
提要视图代码:
@using (Ajax.BeginForm("Default", "FacebookFeed", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.ReplaceWith }))
{
// Form code
<input type="submit" value="Refresh" />
}
因此,当点击刷新按钮时,它应该呈现新数据,但该请求中缺少设置。
到目前为止,我只提出了一种解决方案,使某种设置注册由字符串键索引,他们将在其中注册他们的设置集。
修改视图代码(组件使用):
@Html.Action(
"Default",
"FacebookFeed",
new {
settingsKey = "HomePageFBFeed"
}
)
来自用户的额外代码:
[ComponentSettings]
public class HomePageFBFeed : FacebookFeedSettings
{
public HomePageFBFeed()
{
AppKey = "XYZ";
AppSecret = "123";
PageSize = 10;
}
}
修改后的控制器代码:
public ActionResult Default(string settingsKey)
{
FacebookFeedSettings settings = ComponentSettings.GetSettings(settingsKey);
// Action code using settings
return PartialView(model);
}
修改后的视图代码:
@using (Ajax.BeginForm("Default", "FacebookFeed", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.ReplaceWith }, new { settingsKey = Model.SettingsKey }))
{
...
}
因此,在这种情况下,我只向客户端传递了该配置的一些唯一 ID,这很好,但与第一次相比,它具有糟糕的用户体验,因为它需要在放置组件的视图之外进行管理。
在这种情况下,我也无法使用内联模板,如第一个代码部分所示,因为在这种情况下,设置是在视图范围之外构建的。
请注意,我还需要它来处理应用程序重新启动和跨进程边界(在云中),因此我不能依赖在第一次加载视图时将配置存储在服务器端。
有没有更好的方法/最佳实践如何在 ASP.NET 4.6 / MVC 5 中做到这一点?
如果没有,是否可以在 ASP.NET 5 / MVC 6 中使用?