Как правильно разместить коллекцию в ASP.NET? - PullRequest
0 голосов
/ 12 октября 2019

В настоящее время я изучаю mvc с asp.net. Но у меня возникла проблема при попытке отправить данные с контроллера.

Вот мой код:

   [HttpPost]
    [ValidateInput(false)]
    public ActionResult Create(FormCollection collection)
    {

        PostCareersViewModel career = new PostCareersViewModel
        {
            Title = collection["Title"],
            Description = collection["Description"],
            Photo = collection["Photo"],
            CareerStatus = int.Parse(collection["CareerStatus"]),
            JobDescription = collection["JobDescription"],
            Contact = collection["Contact"],
            MainImage = Encoding.ASCII.GetBytes(collection.Get("Photo"))
        };
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("Title", career.Title.ToString()),
            new KeyValuePair<string, string>("Description", career.Description.ToString()),
            new KeyValuePair<string, string>("Photo", career.Photo.ToString()),
            new KeyValuePair<string, string>("CareerStatus", career.CareerStatus.ToString()),
            new KeyValuePair<string, string>("JobDescription", career.JobDescription.ToString()),
            new KeyValuePair<string, string>("Contact",career.Contact.ToString()),
            new KeyValuePair<string, string>("MainImage",career.MainImage.ToString())
        });

        try
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(UrlAddressHelper.Base_Url);

                //var responseTask = client.PostAsync(PostCareerString, new FormUrlEncodedContent(
                //                                  collection.
                //                                      AllKeys.ToDictionary(
                //                                          k => k, v => collection[v])));
                var responseTask = client.PostAsync(PostCareerString, content);
                responseTask.Wait();

                var result = responseTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index");
                }
            }

            ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

для просмотра, я использую этот код:

<section class="ftco-section">
    <div class="container">
        @using (Html.BeginForm("Create", "PostCareers", FormMethod.Post, new { @class = "bg-light p-5 contact-form" }))
        {
            @Html.AntiForgeryToken()

            <h4>Post New Job Vacancy</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextAreaFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" }, id = "edit" })
                    @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Photo, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextBoxFor(model => model.Photo, new { type = "file", placeholder = Html.DisplayNameFor(model => model.Photo), @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.Photo, "", new { @class = "text-danger" })
                    @*@Html.EditorFor(model => model.Photo, new { htmlAttributes = new { @class = "form-control" } })*@
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.CareerStatus, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("CareerStatus", new SelectList(ViewBag.CSListItem, "Value", "Name"), new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.CareerStatus, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.JobDescription, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.JobDescription, new { htmlAttributes = new { @class = "form-control" } })
                    @*@Html.ValidationMessageFor(model => model.JobDescription, "", new { @class = "text-danger" })*@
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Contact, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Contact, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Contact, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-primary py-3 px-5" />
                </div>
            </div>
        }

        <div>
            @Html.ActionLink("Back to List", "Index")
        </div>
    </div>
</section>

Я получил ошибочный запрос 400.

Он отлично работает, если я использую этот ответ. Задача

var responseTask = client.PostAsync(PostCareerString, new FormUrlEncodedContent(
                                                      collection.
                                                         AllKeys.ToDictionary(
                                                            k => k, v => collection[v])));

хорошо PostAsJson Async требует FormUrlEndcodedContent в качестве параметра, а PostAsync требует httpcontent в качестве параметра. Но он формирует закодированное содержимое отлично работает с PostAsync, и почему FormUrlEndcodedContent не работает с PostAsJsonAsync?

, но я не могу преобразовать это MainImage Encoding.ASCII.GetBytes, потому что я не буду хранить его в моем api как файл(На самом деле я не знаю, работает ли этот метод для загрузки файла).

Есть ли способ с этим справиться? Я делаю правильные вещи, такие как конвертирование FormCollection в model в FormUrlEncodedContent (ну, это все еще дает мне 400 плохих запросов)?

Я действительно ценю каждый ответ, который был опубликован. Заранее спасибо:)

1 Ответ

1 голос
/ 13 октября 2019

Пожалуйста, проверьте изображения ниже. Данные поступают из вида.

Модель

Model

Также, ваш файл изображений идет, который вы выбрали в представлении

File Control data

FormCollection FromCollection Data

Визуализация образца для проверки enter image description here

Пожалуйста, узнайте код

Cshtml Код страницы

<section class="ftco-section">
    <div class="container">
        @using (Html.BeginForm("Create", "PostCareers", FormMethod.Post, new { @class = "bg-light p-5 contact-form", enctype = "multipart/form-data" }))
        {
            @Html.AntiForgeryToken()

            <h4>Post New Job Vacancy</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextAreaFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" }, id = "edit" })
                    @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Photo, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextBox("myphoto",null, new { type = "file", placeholder = Html.DisplayNameFor(model => model.Photo), @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.Photo, "", new { @class = "text-danger" })
                    @*@Html.EditorFor(model => model.Photo, new { htmlAttributes = new { @class = "form-control" } })*@
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.CareerStatus, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">                   
                    @Html.DropDownList("CareerStatus", new SelectList(ViewBag.CSListItem, "Value", "Name"), new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.CareerStatus, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.JobDescription, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.JobDescription, new { htmlAttributes = new { @class = "form-control" } })
                    @*@Html.ValidationMessageFor(model => model.JobDescription, "", new { @class = "text-danger" })*@
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.Contact, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Contact, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Contact, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-primary py-3 px-5" />
                </div>
            </div>
        }

        <div>
            @Html.ActionLink("Back to List", "Index")
        </div>
    </div>
</section>

Код контроллера для тестирования данных поступает или не открывается в сторону

public class PostCareersController : Controller
    {
        public ActionResult Index()
        {
            return View(new PostCareersViewModel());
        }
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Create(FormCollection collection, PostCareersViewModel model, HttpPostedFileBase myphoto)
        {

            PostCareersViewModel career = new PostCareersViewModel
            {
                Title = collection["Title"],
                Description = collection["Description"],
                CareerStatus = int.Parse(collection["CareerStatus"]),
                JobDescription = collection["JobDescription"],
                Contact = collection["Contact"],
            };
            if (myphoto != null)
            {
                string Path = Server.MapPath(string.Concat("~/Upload/", myphoto.FileName));
                myphoto.SaveAs(Path);
                career.Photo = string.Concat(Request.Url.Authority, "/Upload/", myphoto.FileName);
            }
            var content = new FormUrlEncodedContent(new[]
            {
            new KeyValuePair<string, string>("Title", career.Title.ToString()),
            new KeyValuePair<string, string>("Description", career.Description.ToString()),
            new KeyValuePair<string, string>("Photo", career.Photo.ToString()),
            new KeyValuePair<string, string>("CareerStatus", career.CareerStatus.ToString()),
            new KeyValuePair<string, string>("JobDescription", career.JobDescription.ToString()),
            new KeyValuePair<string, string>("Contact",career.Contact.ToString())
        });

            return RedirectToAction("Index");
        }
    }

    public class PostCareersViewModel
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Photo { get; set; }
        public int CareerStatus { get; set; }
        public string JobDescription { get; set; }
        public string Contact { get; set; }
    }

Примечание: вам нужно создать одну папку илиимя папки вашего рабочего приложения " Upload ", когда вы выбираете файл, ваш файл сохраняется в папке, как только это будет сделано, затем вы читаете и отправляете запрос JSON.

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