я могу использовать FromBody и FromUri в .net MVC? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть контроллер MVC asp.net (не web api, не core). Я пытаюсь опубликовать пост, в котором также есть переменная uri. но я получаю.

FromBody не может быть найден, если вы пропустили директиву using или сборка ссылка

то же самое для FromUri

using CFF.CareCenterPortal.BeInCharge.Services;
using CFF.CareCenterPortal.BeInCharge.ViewModels;
using CFF.CareCenterPortal.Web.Controllers.Portal;
using System;
using System.Web.Mvc;

namespace CFF.CareCenterPortal.Web.Controllers.BeInCharge
{
    [Authorize]
    [RoutePrefix("beincharge/caregiver")]
    public class BeInChargeCaregiverController : IdentityController
    {
        [HttpPost] 
        [Route("{id}")]
        public ActionResult EditCaregiver([FromBody()] CareGiverViewModel data, [FromUri()] int id)

        {
            var service = new BeInChargeDataService();
            var result = service.EditCaregiver(data,id,CurrentUser.NameIdentitifier);
            if (result == null)
            {
                return new HttpStatusCodeResult(System.Net.HttpStatusCode.InternalServerError, "An Unhandled Error Occcured");
            }

            if (!String.IsNullOrEmpty(result.Error) && !String.IsNullOrWhiteSpace(result.Error))
            {
                return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, result.Error);
            }

            return Json("Success");
        }

1 Ответ

0 голосов
/ 03 июля 2018

можно ли использовать 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 &raquo;</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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...