使用MVC3从POST请求设置请求对象属性的适当模式?

时间:2012-07-12 14:45:44

标签: asp.net-mvc-3 c#-4.0 http-post

对于我的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;
        } 
    }
}

我想知道是否可以对此做出任何改进,或建议如何以有效的方式实现这一目标。

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

适当的模式是,

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

  return View();
}

注意:

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

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

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