Получение информации из форм для вызова API - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь вызвать API с .netcore, используя страницы MVC и бритвы. Как новый ученик .netcore, я испытываю трудности в понимании методологии работы MVC. Я пытаюсь заполнить форму из информации о пользователе с помощью кнопки отправки, а затем перенести эту информацию в тело запроса для попадания в конечную точку с контроллером. До сих пор мой код выглядит следующим образом.

***View/ Index.cshtml***
@using PTCConnector.Models.DB
@{
    ViewData["Title"] = SharedLocalizer["Users"];
    var user = ViewData["User"] as List<User>;
    List<PTCConnector.Areas.Subscription.Models.SubscriptionModel> filePaths = ViewData["FilePaths"] as List<PTCConnector.Areas.Subscription.Models.SubscriptionModel>;
}
<form method="post" class="form-control-dark">
    <label>
        Username:
        <input type="text" placeholder="admin" readonly />
    </label>
    <br />
    <label>
        Password:
        <input type="text" placeholder="*****" readonly />
    </label>
    <br />
    <label>
        Enter New Password:
        <input type="password" placeholder="New Password" name="new_password" />
    </label>
    <br />
    <button class="btn btn-default" type="submit">SignUp as Admin</button>
</form>

***Models/ wh_adminLoginModel.cs***
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using PTCConnector.Views;
namespace PTCConnector.Areas.Whatsapp.Models
{
    public class wh_adminLoginModel
    {
        public string df_username = "admin";
        public string df_password = "helloWorld";

        public string new_password { get; set; }


    }
}

***Controller/ AuthAdminController.cs
***
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using PTCConnector.Data;
using PTCConnector.Areas.Settings.Models;
using Microsoft.AspNetCore.Mvc.Rendering;
using PTCConnector.Models.DB;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authorization;
using PTCConnector.Areas.Whatsapp.Models;
using System.Net.Http;
using System.Text;
using PTCConnector.Areas.Whatsapp.Models;

namespace PTCConnector.Areas.Whatsapp.Controllers
{
    [Area("Whatsapp")]
    [TypeFilter(typeof(AdminActionFilter))]
    [Authorize(Roles = "Admin")]
    public class WhAuthController : Controller
    {
        public wh_adminLoginModel whLogin = new wh_adminLoginModel();
        public async Task Login()
        {
            HttpClientHandler clientHandler = new HttpClientHandler
            {
                ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
            };
            var client = new HttpClient(clientHandler);

            byte[] bytes = Encoding.UTF8.GetBytes($"{whLogin.df_username}:{whLogin.df_password}");

            var Base64Credentials = Convert.ToBase64String(bytes);

            System.Diagnostics.Debug.WriteLine(Base64Credentials);

            // Set Base64Credentials as Authorization header with Prefix `Basic`
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Base64Credentials);

            // Just some data for POST, change freely!
            var data = new Dictionary<string, string>
            {
//This new_password should come from Model from user view.
                { "new_password", $"{whLogin.new_password}" } 

            };
            System.Diagnostics.Debug.WriteLine(data.Values);
            Console.WriteLine("here 1");
            // Encode the data in FORM URL Data
            var content = new FormUrlEncodedContent(data);

            // Make Async Post Call with Client. Parameters are URL and Data to POST!
            var response = await client.PostAsync("https://localhost:9090/v1/users/login", content);

            // Async!! - Read the response content as String
            var responseString = await response.Content.ReadAsStringAsync();

            // Print out the Response String for Debugging! 
            //Console.WriteLine(responseString);

            System.Diagnostics.Debug.WriteLine(responseString);
            System.Diagnostics.Debug.WriteLine("Check");
            Console.WriteLine("CheckNow");
        }

    }
}

1 Ответ

1 голос
/ 26 июня 2019

По умолчанию в MVC все немаркированные методы считаются GET методами.Если вы отправляете данные обратно на сервер в форме POST, вам необходимо объявить метод как таковой, добавив атрибут метода HttpPost.

[HttpPost]
public IActionResult Login(LoginViewModel model)
{
    ...
}

Обратите внимание на атрибут HttpPost вышеметод?

Вам также нужно будет придерживаться подписи метода (передавая допустимый тип модели) из формы.Вы можете попытаться построить свое представление так:

***View/ Index.cshtml***
@using PTCConnector.Models.DB
@model PTCConnector.ViewModels.LoginViewModel

@{
    ViewData["Title"] = SharedLocalizer["Users"];
    var user = ViewData["User"] as List<User>;
    List<PTCConnector.Areas.Subscription.Models.SubscriptionModel> filePaths = ViewData["FilePaths"] as List<PTCConnector.Areas.Subscription.Models.SubscriptionModel>;
}

@using(Html.BeginForm("Login", "WhAuth", FormMethod.Post))
{
    <label>
        Username:
        @Html.TextBoxFor(m => m.Username, null, new {})
    </label>
    <br />
    <label>
        Password:
        @Html.TextBoxFor(m => m.Password, null, new {})
    </label>
    <br />
    <label>
        Enter New Password:
        @Html.TextBoxFor(m => m.NewPassword, null, new {})
    </label>
    <br />
    <button class="btn btn-default" type="submit">Sign up as Admin</button>
}

Вы заметите, что я добавил к нему модель представления, содержащую значения Username, Password и NewPassword для вас.Вам нужно создать класс в PTCConnector с именем LoginViewModel.cs в новой папке ViewModels с этими 3 переменными в качестве свойств класса (строк).Таким образом, у вас есть отдельная модель для внешнего интерфейса, и она не содержит никакой внутренней информации.Пример ниже:

~/PTCConnector/ViewModels/LoginViewModel.cs

using System;

namespace PTCConnector.ViewModels
{
    public class LoginViewModel
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public string NewPassword { get; set; }
    }
}

При такой настройке, когда вы вводите информацию в форму и нажимаете кнопку Отправить, она должна попасть в бэкэнд и иметь возможность обрабатывать модель.Если вы хотите сделать это полностью независимым, вы можете начать использовать Ajax для создания вызовов и выполнения запросов через Json.Но я чувствую, что сейчас это совершенно новая игра с мячом

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