В настоящее время я изучаю 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 плохих запросов)?
Я действительно ценю каждый ответ, который был опубликован. Заранее спасибо:)