有没有办法从控制器访问 ViewModel 对象?

Is there a way to access the ViewModel object from the controller?

有没有办法在对控制器执行 ajax 请求后引用视图模型的绑定对象(从控制器)?在用户更新输入字段并单击“提交”后,我试图访问在 .cshtml 文件内部更新的视图模型对象的属性,因此我知道要传递给外部的数据 API。

我开始通过 ajax 请求 (amountEur: @Model.AmountEUR) 使用查询字符串的方式传递一些属性,但一直无法确定是否可以访问(某些缓存形式of?) 直接来自控制器的视图模型对象

Index.cshtml

<h1>Converter</h1>

<div class="row">
    <div class="col-md-4">
        <form>
             <div class="form-group">
                Amount in EUR: 
                @Html.TextBoxFor(m => m.AmountEUR);
                @Html.ListBoxFor(x => x.SelectedCurrencyTypes, Model.CurrencyTypes, new { style="width:200px; display:block; margin-top:1vh;" } )
             </div>
             <button id="convertBtn" class="btn btn-success" type="button">Convert</button>
             <p id="data"></p>
        </form>
    </div>
</div>

@section Scripts{
    <script>
        $('#convertBtn').click(function () {
            var url = "/Home/QueryFixerAPI";
            $.get(url, { amountEur: @Model.AmountEUR,  }, function (data) {
                $("#data").html(data);
            });
        })
    </script>
}

查看模型class:

public class HomeIndexViewModel
{
    public float AmountEUR { get; set; }
    public List<SelectListItem> CurrencyTypes { get; set; }
    public List<string> SelectedCurrencyTypes { get; set; }
    public Dictionary<string, float> Rates { get; set; }
}

相关家庭控制器方法:

public ActionResult Index()
{
    HomeIndexViewModel homeIndexViewModel = new HomeIndexViewModel
    {
        SelectedCurrencyTypes = new List<string>(),
        CurrencyTypes = GetCurrencyTypes()
    };

    return View(homeIndexViewModel);
}

public async Task<JsonResult> QueryFixerAPI(float amountEUR)
{
    string url = $"{baseUrl}/{DateTime.Now.ToString("yyyy-MM-dd")}?access_key={accessKey}&base=EUR&symbols=USD,CAD,ILS";

    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new 
            MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await client.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            var serializer = new JavaScriptSerializer();
            Root obj = serializer.Deserialize<Root>(data);

            return Json(data, JsonRequestBehavior.AllowGet);
        }
    }

    return null;
}

.NET MVC 使用无状态的 HTTP,因此您无法访问未传递给控制器​​的表单数据。 您需要在 ajax 请求中包含您需要的所有属性;

var data = {
   amountEur: @Model.AmountEUR,
   CurrencyTypes:{
      ...
   },
   SelectedCurrencyTypes:{
      ...
   },
   Rates:{
      ...
   }
};

$.get(url, data, function (data) {
   $("#data").html(data);
});

然后在你的控制器中,指定数据绑定到你想要的类型;

public async Task<JsonResult> QueryFixerAPI(HomeIndexViewModel viewModel)
{
   var test = viewModel.amountEur;
   ...
}