0

对于我的 MVC3 应用程序的传入 POST 请求,我想验证传入的请求参数。如果存在无效参数,则抛出异常。

给定以下对象:

public class ActionRequest
{
    public string ActionRequestPassword { get; set; }
    public bool EnableNewsfeedAppPool { get; set; }
}

对于传入的发布请求,我想通过以下方式使用适当的属性初始化对象:

public class NewsfeedAppPoolController : Controller
{
    [ActionName("EnableAppPool"), AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    [NoCache]
    public ActionResult EnableAppPool(FormCollection formCollection)
    {
        Models.ActionRequest actionRequest = ValidatePOSTRequest(formCollection);

        // do things with actionRequest

        return null;
    }

    private Models.ActionRequest ValidatePOSTRequest(FormCollection formCollection)
    {
        try
        {
            Type actionRequestType = typeof(Models.ActionRequest);
            System.Reflection.PropertyInfo propertyInfo = null;
            object systemActivatorObject = Activator.CreateInstance(actionRequestType);

            foreach (var key in formCollection.AllKeys)
            {

                propertyInfo = typeof(Models.ActionRequest).GetProperty(key);
                Type t = propertyInfo.PropertyType; // t will be System.String


                if (t.Name == "Int32")
                {
                    actionRequestType.GetProperty(key).SetValue(systemActivatorObject, Convert.ToInt32(formCollection[key]), null);
                }
                else
                {
                    actionRequestType.GetProperty(key).SetValue(systemActivatorObject, formCollection[key], null);
                }
            }

            return (Models.ActionRequest)systemActivatorObject;
        }
        catch (Exception ex)
        {
            throw ex;
        } 
    }
}

我想知道是否可以对此进行任何改进,或者建议如何以有效的方式完成此任务。

谢谢。

4

3 回答 3

1

ASP.Net MVC 已经为您完成了所有这些工作。
只需Models.ActionRequest actionRequest为您的操作添加一个参数。

如果要添加其他验证逻辑,请使用System.ComponentModel.DataAnnotations.

于 2012-07-12T14:49:38.750 回答
1

只需使用默认模型绑定器,它将负责从请求参数实例化和绑定 ActionRequest:

public class NewsfeedAppPoolController : Controller
{
    [ActionName("EnableAppPool"), AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    [NoCache]
    public ActionResult EnableAppPool(ActionRequest actionRequest)
    {
        // do things with actionRequest

        return null;
    }
}
于 2012-07-12T14:51:44.427 回答
0

合适的模式是,

[HttpPost]
public ActionResult Save(Employee employee)
{
  if(ModelState.IsValid)
  {
     db.Save(employee);
     RedirectToAction("Index");
  }

  return View();
}

笔记:

employee实例由默认模型绑定器从请求中可用的值(表单、查询字符串、路由数据等)自动创建和填充

默认模型绑定器将值绑定到模型时,它还会进行验证并将所有错误存储在ModelState字典中,因此通过检查ModelState.IsValid您可以知道验证是否成功。

要了解有关模型绑定的更多信息,请参阅。要了解有关模型验证的更多信息,请参阅

于 2012-07-12T15:12:36.327 回答