c# - 如果我在代码中设置一些值,我仍然可以使用 UpdateModel() 吗?

标签 c# .net asp.net asp.net-mvc

我正在尝试为 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();
    }

我的问题如下:

  1. 在这种情况下我仍然可以使用 UpdateModel() 辅助方法吗?如果是的话请举个例子。或者所有值都必须来自表单才能使反射正常工作?
  2. 即使在这种情况下有办法使用辅助方法,我仍然想学习手动方式。我需要对上面的代码进行哪些更改才能使其正常工作?

最佳答案

是的,可以。

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/

相关文章:

c# - 重命名 WCF 服务引用中的 .datasource 文件

asp.net - Asp.Net 中的静态列表<User> VS 在线用户数据库?

ASP.NET 如何解析 CS1513 : } expected error on page

检测到 C# 无法访问的代码

c# - .Net Core 异步文件结果

.net - 对于 .NET 中的序列化,我应该使用 JavaScriptSerializer 和 XmlSerializer 还是它们对应的 DataContract?

javascript - 无法处理 jqGrid 中的复选框单击事件

c# - 是否可以使用 C# 交互模式?

c# - 如何在linux服务器上使用c#上传asp.net开发的网站

c# - 页面上的 PostBack 后 GridView 上的 jQuery 函数停止工作(鼠标悬停,单击)