【问题标题】:Manually build View Model from Request Data从请求数据手动构建视图模型
【发布时间】:2014-10-14 23:15:01
【问题描述】:

我有一个当前通过 Ajax 提交给控制器方法的页面。 MVC 会自动将请求数据转换为我的 View Model 类型,这很棒。

现在我正在尝试更改它,而不是 Ajax 帖子,而是调用 SignalR。我想通过 SignalR(通过$('form').serialize())提交相同的数据,然后将数据解析为我的视图模型类型。

例子:

//controller
public ActionResult MyMethod(MyViewModel vm){
     //vm is automatically created from form data
}

//SignalR Hub
public void MyMethodViaSignalR(string formData){
    //how can I turn formData or Context.Request into a MyViewModel?
}

//Make the SignalR call
myHub($('form').serialize());

【问题讨论】:

  • 我希望你不必用 signalR 手动反序列化模型。
  • 你能发布你的视图模型代码吗?
  • 这似乎无关紧要。假设它有正常的东西,比如ints、日期、字符串。我希望有一个通用的解决方案,不需要对模型有任何了解。
  • @ErikPhilips 我找到了一个解决方案,以防您有兴趣。

标签: ajax asp.net-mvc signalr


【解决方案1】:

我找到了一个通用的解决方案。我把这段代码放在我的基础控制器中(你也可以把它复制到任何一个控制器上),它会构建你需要的任何视图模型。

    protected class SignalRRequestJSon
    {
        public string H { get; set; }
        public string M { get; set; }
        public List<string> A { get; set; }
        public int I { get; set; }
    }
    public T GetModel<T>(HttpRequest req) where T : class, new()
    {
        var obj = JsonConvert.DeserializeObject<SignalRRequestJSon>(req["data"]);
        var stringWriter = new System.IO.StringWriter();
        var httpResponse = new HttpResponse(stringWriter);

        var url = req.UrlReferrer.ToString(); // this value doesn't matter, but needs to be a valid url.
        var queryStringData = obj.A[0];
        var httpRequest = new HttpRequest("", url, queryStringData);
        var httpContext = new HttpContext(httpRequest, httpResponse);

        var routeData = new RouteData();
        routeData.Values.Add("controller", this.GetType().Name.ToLower().Replace("controller", ""));
        routeData.Values.Add("action", "Arbitrary");

        this.ControllerContext = new ControllerContext(new HttpContextWrapper(httpContext), routeData, this);
        var valueProvider = new QueryStringValueProvider(this.ControllerContext);
        this.ValueProvider = valueProvider;

        var vm = new T();
        UpdateModel(vm, valueProvider);
        return vm;
    }
    public ActionResult Arbitrary<T>(T model)
    {
        return View();
    }

从我的 SignalR 集线器这样调用:

var controller = DependencyResolver.Current.GetService<MyController>();
var vm = controller.GetModel<MyViewModel>(HttpContext.Current.Request);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多