gpt4 book ai didi

c# - 具有 CMS 功能的 ASP.NET MVC3 应用程序

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

我正在学习 ASP.NET MVC3 并开发具有 CMS 功能的应用程序 - 但遇到了一些问题。

基本思想是所有页面都连接到一个页面类型,而该页面类型又具有一组与之相关的属性。

如果我只使用字符串值,效果很好,但我希望能够输入所有属性(String、LongString、XhtmlString、Number 和 TrueFalse)。

这是我想出的模型。

public class Page
{
public int PageId { get; set; }
public int PageTypeId { get; set; }
public string Name { get; set; }

public PageType PageType { get; set; }

public List<PropertyValues> Properties { get; set; }
}

public class PageType
{
public int PageTypeId { get; set; }
public string Name { get; set; }
public string Description { get; set; }

public string Controller { get; set; }
public string Action { get; set; }

public List<PropertyDefinition> Properties { get; set; }
}

public class PropertyDefinition
{
public int PropertyDefinitionId { get; set; }
public string Name { get; set; }
public string Type { get; set; } // NormalString, LongString, XhtmlString, Number, TrueFalse
}

public class PropertyValues
{
public int PropertyValueId { get; set; }
public int PageId { get; set; }
public int PropertyDefinitionId { get; set; }

public string ValueNormalString { get; set; } // input=text
public string ValueLongString { get; set; } // textarea
public string ValueXhtmlString { get; set; } // tinymce
public int ValueNumber { get; set; } // input=text
public bool ValueTrueFalse { get; set; } // input=checkbox

public PropertyDefinition Definition { get; set; }
}

基本上,当我在我的 View 中时,我希望能够调用例如

@Page.Property["Whatever"]

并获取值。我被上面的问题困住了,不知道如何继续。

编辑:

在我从 Russ 那里得到的答案的帮助下,我想出了以下方法 - 这是可行的。不知道有没有更好的解决方法。

有人对如何改进我的解决方案有任何建议吗?

模型:

public class Page
{
public int PageId { get; set; }
public string Name { get; set; }

public List<Property> Properties { get; set; }

Dictionary<string, object> PageData = new Dictionary<string, object>();
public object this[string name]
{
get
{
Property result = this.Properties.Find(
delegate(Property p)
{
return p.Name.Equals(name);
});

if (result != null)
{
switch (result.PropertyDefinition.Type)
{
case "String":
return result.PropertyValue.ValueString;
case "LongString":
return result.PropertyValue.ValueLongString;
case "XHtmlString":
return result.PropertyValue.ValueXhtmlString;
case "Number":
return result.PropertyValue.ValueNumber;
case "Boolean":
return result.PropertyValue.ValueBoolean;
default:
return null;
}
}

return null;
}
set
{
PageData[name] = value;
}
}
}

public class PropertyDefinition
{
public int PropertyDefinitionId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Type { get; set; }
}

public class PropertyValue
{
public int PropertyValueId { get; set; }
public int PropertyId { get; set; }

public string ValueString { get; set; }
public string ValueLongString { get; set; }
public string ValueXhtmlString { get; set; }
public int ValueNumber { get; set; }
public bool ValueBoolean { get; set; }
}

public class Property
{
public int PropertyId { get; set; }
public string Name { get; set; }
public string Caption { get; set; }

public Page Page { get; set; }
public PropertyDefinition PropertyDefinition { get; set; }
public PropertyValue PropertyValue { get; set; }

public int PageId { get; set; }
public int PropertyDefinitionId { get; set; }
public int PropertyValueId { get; set; }
}

Controller :

public class HomeController : Controller
{
public String Index()
{
List<Property> properties = new List<Property>();
Property propertyOne = new Property {
PropertyId = 1,
Name = "Title",
Caption = "Page Title",
TestPageId = 1,
PropertyValue = new PropertyValue {
PropertyValueId = 1,
PropertyId = 1,
ValueString = "This is the page title"
},
PropertyDefinition = new PropertyDefinition {
PropertyDefinitionId = 1,
Name = "String",
Description = "String (< 255 characters)",
Type = "String"
}
};
properties.Add(propertyOne);

Page CurrentPage = new Page
{
TestPageId = 1,
Name = "Testpage",
Properties = properties
};


return CurrentPage["Title"].ToString();
}

}

最佳答案

假设传递给强类型 View 的模型是 Page 类型, 那么它应该只是 @Model.Properties .所以你的 Razor View 看起来像

@* set the model for the view to be of type Page *@
@model Page

@* to get the properties *@
@foreach(var prop in Model.Properties)
{
<p>@prop.PageId</p>
}

为了索引到Properties使用字符串的集合,我建议使用 Dictionary<string, PropertyDefinition>而不是 List<PropertyDefintion> , 或者将其设为 KeyedCollection<TKey, TItem> .

您可能决定创建自己的 WebViewPage,添加一个 Page继承自 System.Web.Mvc.WebViewPage 的属性然后在 Views 文件夹下的 web.config 中将其设置为 baseType

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<!-- Set your type here below -->
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.Configuration"/>
<add namespace="System.ComponentModel.DataAnnotations"/>
</namespaces>
</pages>
</system.web.webPages.razor>

关于c# - 具有 CMS 功能的 ASP.NET MVC3 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8505404/

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