有没有办法从控制器访问 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;
...
}
有没有办法在对控制器执行 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;
...
}