我正在尝试为 ASP.NET MVC Web 应用程序实现“创建”操作方法。我知道有一个辅助方法可以实现此目的,并且已在其他页面上成功使用它,其中表单和模型之间存在完美的 1:1 匹配。我的问题与我试图添加的新页面有关,该页面需要发布表单中捕获的值和以编程方式设置的值的组合。这是一个例子。
MembershipUser user = Membership.GetUser(User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
review.UserID = guid;
review.BusinessID = Convert.ToInt16(Request.Form["BusinessID"]);
review.Comments = Request.Form["Comments"];
review.Rating = Convert.ToInt16(Request.Form["Rating"]);
reviewsRepository.AddNewReview(review);
reviewsRepository.Save();
正如您在此示例中看到的,UserID 在代码中定义,其余值来自表单中的用户输入。
这是我的 AdNewReview 和 Save 方法的代码。
public void AddNewReview(Review review)
{
db.Reviews.InsertOnSubmit(review);
}
//
//Persist changes to database
public void Save()
{
db.SubmitChanges();
}
我的问题如下:
- 在这种情况下我仍然可以使用 UpdateModel() 辅助方法吗?如果是的话请举个例子。或者所有值都必须来自表单才能使反射正常工作?
- 即使在这种情况下有办法使用辅助方法,我仍然想学习手动方式。我需要对上面的代码进行哪些更改才能使其正常工作?
最佳答案
是的,可以。
UpdateModel 只是将值从 Form
复制到对象。您仍然可以自己更改它们。
但是,请记住,如果表单中也存在这些值,它们将被覆盖,因此您可以先调用 UpdateModel
。
MembershipUser user = Membership.GetUser(User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
// Copy form values
UpdateModel(review);
// Overwrite custom values
review.UserID = guid;
reviewsRepository.AddNewReview(review);
reviewsRepository.Save();
还要注意使用 UpdateModel
的安全隐患。恶意用户可能会添加表单中没有的属性,如果它们匹配,它们仍会在模型上设置。
您可以通过使用需要更新属性的 string[]
白名单的重载来避免这种情况,以确保仅更新允许用户修改的属性。
MembershipUser user = Membership.GetUser(User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
// Copy form values
UpdateModel(review, new string[] { "BusinessID", "Comments", "Rating" });
// Overwrite custom values
review.UserID = guid;
reviewsRepository.AddNewReview(review);
reviewsRepository.Save();
如果您想要类型更安全的东西,您还可以创建一个仅包含要更新的属性的接口(interface),并将其作为泛型类型 arg 传递:
public interface IReviewEditableFields
{
int BusinessID;
string Comments;
int Rating;
}
// This will only update the BusinessID, Comments and Rating properties
UpdateModel<IReviewEditableFields>(review);
编辑:
我只是在寻找更多关于此的信息,并找到了这篇文章:
ASP.NET MVC UpdateModel vulnerable to hacking?
似乎您还可以将类上的属性列入白名单,这似乎是可维护性更好的地方:
[Bind(Include="MyProp1,MyProp2,MyProp3")]
public partial class MyEntity { }
关于c# - 如果我在代码中设置一些值,我仍然可以使用 UpdateModel() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7755816/