Отправка формы и передача данных контроллеру типа FileStreamResult
У меня есть форма mvc (сделанная из модели), которая при отправке, я хочу получить параметр
У меня есть код для установки формы и получения параметра
using (@Html.BeginForm("myMethod", "Home", FormMethod.Get, new { id = @item.JobId })){
}
и внутри моего домашнего контроллера у меня
[HttpPost]
public FileStreamResult myMethod(string id)
{
sting str = id;
}
Однако я всегда получаю ошибку
Ресурс, который вы ищете (или одна из его зависимостей), может были удалены, было изменено его имя или временно недоступен. Просмотрите следующий URL-адрес и убедитесь, что он правильно написано.
Когда я опускаю [HttpPost]
, код выполняет файл, но переменные str
и id
равны нулю.
Как я могу это исправить?
ИЗМЕНИТЬ
Может ли это быть вызвано тем, что myMethod в контроллере не ActionResult? Я понял, что когда у меня есть метод типа Actionresult, где метод привязан к представлению, все работает хорошо. Но тип FileStreamresult не может быть привязан к представлению. Как передать данные таким методам?
Ответы
Ответ 1
Если вы сомневаетесь, следуйте соглашениям MVC.
Создайте viewModel, если у вас еще нет свойства JobID
public class Model
{
public string JobId {get; set;}
public IEnumerable<MyCurrentModel> myCurrentModel { get; set; }
//...any other properties you may need
}
Сильно введите свой вид
@model Fully.Qualified.Path.To.Model
Добавьте скрытое поле для JobId в форму
using (@Html.BeginForm("myMethod", "Home", FormMethod.Post))
{
//...
@Html.HiddenFor(m => m.JobId)
}
И принять модель в качестве параметра в действии вашего контроллера:
[HttpPost]
public FileStreamResult myMethod(Model model)
{
sting str = model.JobId;
}
Ответ 2
Это связано с тем, что вы указали метод формы как GET
Измените код в представлении:
using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){
}
Ответ 3
Кажется, вы указываете форму для использования запроса HTTP GET с помощью FormMethod.Get
. Это не сработает, если вы не сообщите ему, что хотите сделать запись, поскольку это то, что вам, по-видимому, нужно сделать ActionResult. Это, вероятно, будет работать, изменив FormMethod.Get
на FormMethod.Post
.
Кроме того, вы также можете подумать о том, как работают запросы Get и Post, и как они взаимодействуют с Model.
Ответ 4
здесь проблема связана с моделью, если вы указываете класс, тогда привязка модели может понять ее во время публикации, если она является целым числом или строкой, тогда вы должны указать [FromBody], чтобы связать ее правильно.
внести следующие изменения в FormMethod
using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){
}
и внутри вашего домашнего контроллера для привязки строки, которую вы должны указать [FromBody]
using System.Web.Http;
[HttpPost]
public FileStreamResult myMethod([FromBody]string id)
{
// Set a local variable with the incoming data
string str = id;
}
FromBody доступен в System.Web.Http. убедитесь, что у вас есть ссылка на этот класс и добавлена в файл cs.