我在我的ASP.NET MVC 3应用程序中定义了一个区域(Admin),_ViewStart.cshtml在该区域中创建并添加Layout = "~/Views/Shared/_Layout.cshtml";到该区域以具有统一的站点布局.
我还将以下代码添加到_Layout.cshtml:
if (HttpContext.Current.User.IsInRole("Admin"))
{
<li>@Html.ActionLink("Items List", "Index", "Items", new { area = "Admin" }, null)</li>
}
Run Code Online (Sandbox Code Playgroud)
该Admin区域_Layout.cshtml以其布局正确显示.但是页面中的所有导航链接现在都指向Admin子文件夹.
例如,在我的布局中,我<li>@Html.ActionLink("About Us", "About", "Home")</li>指出了Mysite/Home/About.但点击管理链接后,"关于我们"链接指向/Admin/Home/About.
如果让_Layout.cshtml链接指向正确的地址,我该怎么办?
谢谢.
只是想了解更多关于RelatedTo属性的信息,我发现它已被EF 4.1 RC中的ForeignKey和InverseProperty属性所取代.
有没有人知道有关此属性变得有用的场景的任何有用资源?
我应该在导航属性上使用此属性吗?例:
public class Book
{
public int ID {get; set;}
public string Title {get; set;}
[ForeignKey("FK_AuthorID")]
public Author Author {get; set;}
}
public class Author
{
public int ID {get; set;}
public string Name {get; set;}
// Should I use InverseProperty on the following property?
public virtual ICollection<Book> Books {get; set;}
}
Run Code Online (Sandbox Code Playgroud) 仅供参考:我明确指的是SQL Server 2000-8和C#.因此,像MySql这样具有枚举支持的DBMS不是我的问题的主题.
我知道这个问题在SO中被多次询问过.但是,我仍然在答案中看到,采用不同的方法在db中存储枚举值.
将枚举保存为db中的int并在代码中提取枚举值(或使用反射的枚举描述属性):
这是我通常使用的方法.问题是当我尝试从SSMS中的数据库查询时,检索到的数据很难理解.
将枚举保存为db中的字符串(varchar)并在代码中强制转换为int.
实际上,这可能是最好的解决方案.但是(不要笑!)它感觉不对.我不确定这个缺点.(除了db中通常可以接受的更多空间之外)还有其他任何反对这种方法的方法吗?
在db中有一个单独的表,它与代码的枚举定义同步,并在主表和枚举表之间建立外键关系.
问题是稍后应该添加另一个枚举值,代码和数据库都需要更新.此外,可能会有拼写错误!
所以一般来说,当我们在第二个解决方案中接受db的开销时,在db中存储枚举值的最佳方法是什么?对此有一个明确的设计模式规则吗?
谢谢.
如果用户访问我网站的根网址,我想启动一些脚本.
例如,我想在用户访问时在我的视图中执行某些操作
www.example.com example.com www.example.com/ http://www.example.comhttp://example.com ...... [以上的各种组合.]
而不是www.example.com/anything else.
在ASP.NET MVC 3 [Razor]网站和javascript的视图页面中检查这个的最安全的方法是什么?另外,有没有办法找出只使用javascript?
谢谢.
我正在尝试为我的网站实施OpenID身份验证.这是场景:
我希望用户能够
现在我不知道我应该为open id存储什么凭据.并且不确定数据库架构.这是数据库模式:
Table: Users
UserId => PK
... => Custom info. Not related to authentication.
Table: Authentication
AuthenticationId => PK
LoginId => (when custom site membership => email address) (when openId => openid unique address)
UserId => FK to Users.
Provider =>(when custom site membership => "CUSTOM") (when openId => openid provider address)
Password => filled when using custom membership. empty when using open id.
Run Code Online (Sandbox Code Playgroud)
现在,当用户登录时,无论是使用openid /自定义成员身份,我只需查看身份验证表并查找凭据并获取相应的用户.如果没有用户,我创建一个新用户并在身份验证表中添加一个条目.
主要问题:存储Provider和LoginId(请参阅上面的注释以查看存储在这些字段中的内容)是否足以存储openid身份验证?我应该存储任何其他数据,以便在用户返回时我可以根据我保存的数据对他/她进行身份验证吗?
您是否建议采用其他(更有效)方法来实现此目的?
谢谢.
architecture openid authentication dotnetopenauth asp.net-mvc-3
我是EF4的新手,之前没有任何经验.所以,如果这是一个非常简单的问题,请耐心等待.我在BOL中有我的POCO实体(.tt文件),DAL中有.edmx文件(EDM),在Presentation层有我的webapp.所有业务逻辑都转到BLL层.以下是参考资料:
UI - > BLL-DAL-BOL
BLL - > DAL-BOL
DAL - > BOL
BOL - >我的项目都没有.
1-我对层次区分的理解是否正确?我是朝着正确的方向吗?2-如何将ASP.NET成员资格提供程序与实体一起使用.我应该实现成员身份,持久性也无知并将sql server中的所有用户表映射到实体?
2-如何添加自定义验证?我不是指maxlength或有效的电子邮件...,我的意思是访问级别.例如,我希望某些用户能够在我的网站中修改字段(比如productprice).我应该在哪里使用User.IsInRole方法?BLL没有任何对用户信息的引用.我应该将一些参数传递给BLL(如"bool CanChangePrice")来澄清访问级别吗?
我对设计模式概念有点新意.
C#是我的主要编程语言.(我不时使用VB).我不想写一些不灵活,不可扩展和错误的草率代码.
每当我看到一个设计模式在运行时,我就会喜欢它背后的逻辑并理解它,但不幸的是,我在我的项目中实现它们时遇到了麻烦.
你看,有很多设计模式(我认为120+),当我想决定使用哪一种时,我有点迷失.
当谈到使用它们时,我不知道该选择什么.
我从教程中得到的是一些相当简单的代码片段,它远离生产环境.除了DDD模式,我已经设法好好学习它,因为至少有2本好书和很多资源.
现在我的问题
是:有什么地方可以找到一些使用各种设计模式的真实样本吗?至少有一些"更实用"的样本.你知道我能在哪里找到其他模式的书籍/样本/资源吗?
谢谢.
我正在使用实体框架的分层架构.这是我到目前为止所提出的(所有项目除了UI都是类库):
实体:POCO实体.完全坚持无知.没有参考其他项目.由Microsoft的ADO.Net POCO实体生成器生成.
DAL:带有上下文类的EDMX(实体模型)文件.(t4生成).参考文献:Entities
BLL:业务逻辑层.将在此层上实现存储库模式.参考文献:Entities,DAL.这是填充objectcontext的地方:var ctx=new DAL.MyDBEntities();
UI:表示层:ASP.NET网站.引用:Entities,BLL+配置文件中实体的连接字符串条目(问题#2).
现在我的三个问题:
在我的UI中,我按如下方式访问BLL:
var customerRep = new BLL.CustomerRepository();
var Customer = customerRep.GetByID(myCustomerID);
问题是我必须在我的UI的web.config/app.config中定义实体连接字符串,否则我会得到一个运行时异常.IS定义UI中的实体连接字符串会破坏图层的区别吗?或者它是否可以在多层分层架构中进行访问.
感谢并为这个冗长的问题道歉.
我已经定义了一个GenericRepository类来执行db交互.
protected GenericRepository rep = new GenericRepository();
Run Code Online (Sandbox Code Playgroud)
在我的BLL类中,我可以查询db,如:
public List<Album> GetVisibleAlbums(int accessLevel)
{
return rep.Find<Album>(a => a.AccessLevel.BinaryAnd(accessLevel)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
BinaryAnd是一种扩展方法,它逐位检查两个int值.例如AccessLevel=5=> AccessLevel.BinaryAnd(5)并且AccessLevel.binaryAnd(1)都返回true.
但是我不能在LINQ查询中使用此扩展方法.我得到一个运行时错误如下:
LINQ to Entities does not recognize the method 'Boolean BinaryAnd(System.Object, System.Object)' method, and this method cannot be translated into a store expression.
还尝试将其更改为自定义方法,但没有运气.解决方法有哪些?
我是否应该获取所有专辑,然后通过foreach循环迭代它们并选择与AccessLevels匹配的专辑?
这种情况的最佳设计是什么?
我有不同的对象类型:User,Channel,MessageBox,UserGroup,等
User,并Channel可以对其他对象的权限.例如User,将以下枚举定义为其权限MessageBox:
CanRead,
CanWrite,
CanDelete,
...
Run Code Online (Sandbox Code Playgroud)
其他枚举被定义为User其他对象类型的所有者.
此外,Channel在这些对象上具有不同的枚举值.例如,考虑Channel作为所有者和MessageBox对象:
CanDispath
CanRetrieve
...
Run Code Online (Sandbox Code Playgroud)
使用按位比较从数据库中的特定表保存和检索所有权限:
OwnerID........OwnerType........ObjectID........ObjectType........AccessLevel
1 User 10 MessageBox 38
5 Channel 12 MessageBox 18
Run Code Online (Sandbox Code Playgroud)
现在在代码背后,实现权限类的最佳方法是什么?
1-定义PermissionManager,UserPermissionManager,ChannelPermissionManager分别类彼此.其他类只是调用PermissionManager:
if (new PermissionManager.HasAccess(CurrentUser,
CurrentMessageBox,
UserPermissions.CanReadMessages))
Run Code Online (Sandbox Code Playgroud)
然后PermissionManager根据OwnerType(UserPermissionManager 或ChannelPermissionManager)决定与之相关的类,并调用其HasAccess方法.这样,PermissionManager.HasAccess总是被调用,我认为它可以使代码更易于维护和扩展.这是我的首选解决方案,但由于PermissionManager,UserPermissionManager并ChannelPermissionManager …
architecture ×3
c# ×3
asp.net ×2
.net ×1
c#-4.0 ×1
enums ×1
hierarchy ×1
javascript ×1
linq ×1
openid ×1
poco ×1
razor ×1
sql-server ×1