对于我的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;
}
}
}
我想知道是否可以对此做出任何改进,或建议如何以有效的方式实现这一目标。
感谢。
答案 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
您可以知道验证是否成功。