我有一个MVC4应用程序,我正在为编辑表单填充模型。
public class GuestEventModel{
public String name {get;set;}
public Int32 GuestID {get;set;}
public String Address {get;set;}
public Int32 EventID {get;set;}
}
在我的表单中,我使用@Html.HiddenFor(m=> m.EventID)
和@Html.HiddenFor(m=> m.GuestID)
,因此在帖子中,模型会填充这些详细信息。我发现自己必须在整个系统中重复代码,以检查当前登录用户是否可以更新这些客户详细信息以及客户是否属于该事件,因为
答案 0 :(得分:2)
这是一个非常普遍的问题,有很多方法可以解决它。但您可以简单地限制Data Access Layer
仅获取已与用户ID关联的数据。
用户在系统中成功通过身份验证后,您应该将userId
保留在Session
中或加密到Cookie
内,而不是依靠客户端来传递userId。
然后,您的GuestEventModel
可以是:
public class GuestEventModel
{
public Int32 UserId { get; set; } // could also be a reference to a 'User' object
public String name {get;set;}
public Int32 GuestID {get;set;}
public String Address {get;set;}
public Int32 EventID {get;set;}
}
然后,只要您访问数据层/存储库:
public ActionResult Show(Int32 id)
{
// assuming you changed your DAL/Repository accordingly
var guestEvent = dataSource.GetUserEventById(id, Session["userID"] as Int32);
// or.., assuming your DAL/Repository exposes IQueryable
var guestEvent = dataSource<GuestEventModel>
.Where(x => x.UserId == Session["userID"] as Int32)
.Single(x => x.Id == id);
// ....
return View(eventViewModel);
}
答案 1 :(得分:0)
正如您所指出的,没有什么可以阻止用户编辑此客户端。
您不必从HTML填充它。在post方法中,您可以从服务器将EventID和GuestID分配给模型,以防止任何人更改它。
public ActionResult SaveEvent(GuestEventModel model) {
model.EventID = this.Database.GetEventId();
model.GuestID = this.Database.GetGuestId();
}