- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的应用程序中,我有不同的页面:联系我们、关于我们、主页
它们都具有需要填充 View 的相同基本元素:
但是在每个页面上,它们都有一些不同的元素:
联系我们
关于我们
首页
它们都被路由到相同的 Controller 操作方法,因为除了根据页面类型填充“额外”信息之外,大多数功能都是相似的。
到目前为止,我已经做了一些事情:
PageDetailViewData pageDetailViewData = new PageDetailViewData {Title = title, Desc = desc....}
然后我有:
switch ((PageType)page.PageType)
{
case (PageType.Contact):
return View("ContactUsDetails", pageDetailViewData);
default:
return View(pageDetailViewData);
}
问题是如何填充“额外”信息?我不确定我是否会以正确的方式进行此操作。任何对更好地构建逻辑流程的见解都将不胜感激。
最佳答案
使用接口(interface)来暗示 View 模型之间的某些共性的答案肯定会有助于回答您问题中的某些要点。
不过,我想问一下,“重构”您的 Action 以支持不同数据结构的多个 View 是多么明智。
MVC Controller 操作通常表示收集生成预期 View 所需的特定数据所需的最少代码量。单个操作返回同一模型数据的不同 View (例如 Html View 或移动 View )并不少见,但是通过改变数据的结构和将生成的 View 会引入一些问题。
特别是您违反了常见的最佳实践,例如 Single Responsibility Principle并使您的代码测试起来更加复杂 - 无痛测试和 TDD 毕竟是 ASP.Net MVC 的巨大胜利的一部分。
我个人会有一个单独的 Action。
就您的 View 模型而言,如果这是一个数据库,您会怎么做?您会对单独的数据进行单独的查询,对吗?
用户的个人资料信息将与页面元数据信息分开查询。这样做的原因有很多,例如能够缓存数据的某些部分但不能缓存其他部分。
根据上述建议,您的代码可能如下所示(警告:此代码不是用 Visual Studio 编写的,可能充满语法问题):
public interface IMetaDataViewModel
{
PageMetaData MetaData{get; set;}
}
public class HomeViewModel : IMetaDataViewModel
{
public PageMetaData MetaData{get; set;}
public string HomePageText{get; set;}
}
//other view models go here....
public class CommonPagesController : Controller
{
private MetaDataProvider _metaProvider = new MetaDataProvider();
private PageDataProvider _pageDataProvider = new PageDataProvider();
private ContactDataProvider _contactDataProvider = new ContactDataProvider();
public ActionResult Home()
{
var viewModel = new HomeViewModel
{
MetaData = _metaProvider.GetPageMeta();
HomePageText = _pageDataProvider.GetPageData();
};
return View(viewModel);
}
public ActionResult Contact()
{
var viewModel = new ContactViewModel
{
MetaData = _metaProvider.GetPageMeta();
ContactFormData = _contactDataProvider.GetData();
};
return View(viewModel);
}
//you get the picture...
}
您还可以通过多种方式重构 View 模型代码的生成,但这是一种可能的模式。
我很欣赏这个答案确实有一定的意见,但我会考虑采取单独的行动是最佳做法。
希望对您有所帮助。
关于c# - ASP.NET MVC : Populating Derived Strongly Typed View with Base Strongly Typed View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463631/
我在 Ubuntu 11.10 和最新版本的 NetBeans 下使用 C++。假设我有以下代码: class Node {} class DerivedNode : public Node {} c
这两者在 GHC 中有什么区别。它们的预期用途似乎相似,但 deriving (Data)已经存在了一段时间了deriving (Generic)最近才添加到 GHC 中。 是 deriving (G
当您将矩阵对象作为 MatrixBase 引用传递给函数时会发生什么?我不明白幕后到底发生了什么。 示例函数代码如下: #include #include using namspace Eigen
我正在尝试了解如何在 Eigen 中使用样条曲线,特别是我想在某个点上找到样条插值及其一阶和二阶导数的值。找到内插值很容易,但是当我尝试计算导数时,我得到了奇怪的值。 我尝试按照手册 ( http:/
使用 C++ Builder XE7 我有一个带有 TImageList 对象的基本表单 object FormBase: TFormBase Left = 0 Top = 0 Capti
我正在制作基类和派生类。派生类的值将为 Eigen::Matrix , 并继承了 Base 的所有方法。 我这样做是为了使无论矩阵类型如何都相同的方法不会因为 Matrix 的不同模板参数而全部重复。
我最近更新到最新的 Eigen 版本 (3.3.90),看起来它破坏了我之前工作的东西(在我使用 libigl 库附带的 Eigen 版本 3.2.10 之前)。 我想将 block 的结果存储到一个
我最近一直在尝试“向我学习 Haskell”,我想创建一个新类型来表示整数状态,而不仅仅是使用原始 Integer(为了类型安全和代码清晰)。具体来说,以下代码编译: newtype AuxState
这个问题已经有答案了: Access subclass fields from a base class in Java (4 个回答) 已关闭 4 年前。 我对 Java 和面向对象编程总体来说是新
我有这些类,事件记录模式的实现: public abstract class RecordCollection : ObservableCollection where T : Record publ
首先,这个问题非常类似于 downcasting shared pointer to derived class with additional functionality is ,哪里有好的答案。但
好的,我正在通读 this entry in the FQA处理将 Derived** 转换为 Base** 的问题以及为什么它被禁止,我得到的问题是你可以分配给 Base* 不是 Derived*
我正在使用 Boost.Python 将我的 C++ 代码公开给 Python。我遇到了与将对象从一种语言多次传递到另一种语言有关的困难。这是我想要做的: C++代码 class Base { p
这个问题在这里已经有了答案: Downcasting using the 'static_cast' in C++ (3 个答案) 关闭 8 年前。 我不明白为什么会这样。pReallyABase
https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial 的问题 7 “找到每个大陆中最大的国家(按面积),显示大陆、名称和面积:” 我不明白为什么
我很难理解为什么以下代码无法编译: template class Base { public: Base(int a){} }; template class Derive
我很难理解为什么以下代码无法编译: template class Base { public: Base(int a){} }; template class Derive
Base to Derived 是可能的(装箱)。但是 Derived to base 给出了运行时异常,然而这相当于拆箱。为什么会这样 Base b = new Base(); Child c =
库代码 我的图书馆有一个 CRTP 类 B . 我创建了一个 Trait使用户能够更改 B 行为的类. 默认设置为 int . ( #1 ) #include #include //B and T
我正在学习 C++ 继承,所以我通过动态创建一个 Base 类来尝试这段代码,并对它的 Derived 类进行向下转换(显然向下转换无效)以使这个动态创建的 Base 对象被指向派生类指针。但是当我通
我是一名优秀的程序员,十分优秀!