Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。

时间:2024-01-11 17:13:44

场景:有三个市场(Global、China、USA),对前台传过来的数据有些验证需要细化到每个市场去完成。

所以就出现了基类(Global)和派生类(China、USA)

定义基类(Global)PersonalInformationController

  public abstract class PersonalInformationController : BaseController
     {
         #region Abstract/Virtual Methods
         //定义一个抽象方法
         public abstract JsonResult ValidatePersonalInfo(string personJsonString);

         #endregion
   [HttpPost]
         public JsonResult Validate()
         {
             //这里就是不急着反序列化到具体实体中,纯粹获取json数据。
             string myJson = string.Empty;
             using (System.IO.StreamReader sr = new System.IO.StreamReader(Request.InputStream))
             {
                 myJson = sr.ReadToEnd();
             }

             Agreement agreement = null;
             JsonResult jsResult = ValidatePersonalInfo(myJson);
             if (jsResult != null)
             {

                 return jsResult;
             }
 }

现在需要将China前台传过来的数据进行验证,其实mvc中自己实现了反序列化"Post Body",诸如:

         [HttpPost]
         public JsonResult Validate(TestModel model)
         {
 ///...............
 }

定义一个具体的实体去接收数据。那问题来了,Global中用具体的实体接收这个数据,但是不同的市场的数据是不一样的,所以这里就轮到StreamReader上场了,将json数据读取出来不急着反序列化。而是将json数据通过抽象方法传递到China的后台验证中,让它反序列化到对应的实体中。

 //China市场的后台验证 

 public class PersonalInformationController : Global.Controllers.PersonalInformationController
     {
    //重写基类中function并实现.
  public override JsonResult ValidatePersonalInfo(string personJsonString)
         {
             agreement = null;
             PersonalInformationViewModel personViewModel = JsonSerializer.DeserializeFromString<PersonalInformationViewModel>(personJsonString);

             ValidationResult validate = new PersonalInformationValidator().Validate(personViewModel);
             if (!validate.IsValid)
             {
                 var errs = validate.Errors.Select(x => x.ErrorMessage);
                 return Json(new { MessageType = "ValidateError", Content = errs }, JsonRequestBehavior.AllowGet);
             }
 }