можно ли использовать FromBody и FromUri в .net MVC?
Нет. Из того, что я понимаю, эти атрибуты являются только соглашением WebAPI. Вы можете либо использовать WebAPI Controller (очень просто), либо написать собственный пользовательский связыватель модели для MVC , который может проверять параметр на наличие атрибутов, чтобы имитировать ваши потребности.
Я не уверен, что вы в курсе, но MVC ModelBinder уже получает значения из Route, QueryString и Body для материализации параметров.
Вы можете посмотреть исходный код для MVC . Наиболее важным является ValueProviderFactories , который имеет следующий метод:
private static readonly ValueProviderFactoryCollection _factories
= new ValueProviderFactoryCollection()
{
new ChildActionValueProviderFactory(),
new FormValueProviderFactory(),
new JsonValueProviderFactory(),
new RouteDataValueProviderFactory(),
new QueryStringValueProviderFactory(),
new HttpFileCollectionValueProviderFactory(),
new JQueryFormValueProviderFactory()
};
Это то, что MVC использует для значений провайдера для подшивки модели.
Пример:
Я взял веб-сайт MVC по умолчанию и внес следующие изменения:
/ вид / дом / Index.cshtml
строка: 8:
<p><a class="btn btn-primary btn-lg js-test">Learn more »</a></p>
Добавлено в конец файла:
<script src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script>
$(document).ready(function () {
$('.js-test').on('click', function () {
$.ajax({
url: '@Url.RouteUrl(new{ action="Name", controller="Home", id=5})',
data: JSON.stringify({Name: 'My Test Name' }),
type: 'POST',
dataType: 'json',
contentType: "application/json",
});
})
});
</script>
Добавлен следующий файл:
/ Models / Главная / TestVM.cs
public class TestVM
{
public string Name { get; set; }
}
Обновлен контроллер:
/ Контроллеры / HomeController.cs:
public ActionResult Name(TestVM test, int id)
{
System.Diagnostics.Debug.WriteLine(test.Name);
System.Diagnostics.Debug.WriteLine(id);
return new EmptyResult();
}
Теперь, когда кнопка нажата, делается следующий запрос:
Request URL: http://localhost:53549/Home/Name/5
Request Method: POST
Status Code: 200 OK
Remote Address: [::1]:53549
Referrer Policy: no-referrer-when-downgrade
Cache-Control: private
Content-Length: 0
Date: Tue, 03 Jul 2018 17:21:55 GMT
Server: Microsoft-IIS/10.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 23
Content-Type: application/json
Host: localhost:53549
Origin: http://localhost:53549
Pragma: no-cache
Referer: http://localhost:53549/
{Name: "My Test Name"}
Name
:
"My Test Name"
Окно My Debug Отпечатки:
Имя моего теста
* * 5 тысяча сорок-девять
My Test Name
- это ModelBound из JsonValueProviderFactory
, а идентификатор, который приходит из URL http://localhost:53549/Home/Name/5
, - это ModelBound из RouteDataValueProviderFactory
.