Основная модель Asp.net не привязана к форме
Я улавливаю почтовый запрос со статической страницы третьей стороны (сгенерированный Adobe Muse) и обрабатываю ее с помощью действия MVC.
<form method="post" enctype="multipart/form-data">
<input type="text" name="Name">
...
</form>
Маршрутизация для действия пустой формы:
app.UseMvc(routes => routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}"));
Но в соответствии с действием у меня есть модель с любым свойством пуст
Действие:
[HttpPost]
public void Index(EmailModel email)
{
Debug.WriteLine("Sending email");
}
Модель:
public class EmailModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Company { get; set; }
public string Phone { get; set; }
public string Additional { get; set; }
}
Request.Form
имеет все значения из формы, но модель пуста
[0] {[Name, Example]}
[1] {[Email, [email protected]]}
[2] {[Company, Hello]}
[3] {[Phone, Hello]}
[4] {[Additional, Hello]}
Ответы
Ответ 1
Будьте осторожны, чтобы не дать параметру действия имя, которое совпадает с именем модели, или связующее будет пытаться связываться с параметром и терпеть неудачу.
public async Task<IActionResult> Index( EmailModel email ){ ... }
public class EmailModel{ public string Email { get; set; } }
Измените параметр "электронная почта" на другое имя и привяжите его как ожидалось.
public async Task<IActionResult> Index( EmailModel uniqueName ){ ... }
Ответ 2
Я не уверен, что это тот же случай, но у меня была такая же проблема, и на самом деле мне не кажется, что это работает.
Проблема в моем случае состояла в том, что у меня было свойство Model в моем классе модели модели
public string Model { get; set; }
Когда я переименовал свойство в ModelName, все снова работало нормально, даже без атрибута FromForm.
Похоже, что некоторые специальные имена свойств могут быть проблемой для привязки модели asp.net mvc.
Итак, мой совет - проверить ваши свойства модели и, возможно, попытаться переименовать их один за другим, чтобы проверить, есть ли проблема.
Надеюсь, что это поможет.
Ответ 3
Измените void на ActionResult.
[HttpPost]
public ActionResult Index(EmailModel email)
И не забывайте проверять AntiForgeryToken на вашем представлении и действии.
// to your form in view
@Html.AntiForgeryToken()
// ------------
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(EmailModel email)
Ответ 4
У меня такая же проблема
эти документы помогают мне понять привязку модели
https://docs.asp.net/en/latest/mvc/models/model-binding.html
Я решил свою проблему, убедившись, что имя свойства является точным совпадением в имени поля формы
и я также добавляю атрибут [FromForm], чтобы точно указать источник привязки.
Ответ 5
Эта проблема также может возникнуть, если одно или несколько ваших свойств в модели запроса не могут быть привязаны к приемлемому в модели запроса.
В моем случае я должен был передать тип List<string>
свойству, но случайно передал string
. Это привело к тому, что вся модель запроса стала null
Ответ 6
Я столкнулся с этим сегодня, и хотя в ретроспективе это кажется очевидным, я подумал, что добавлю, что вам нужно убедиться, что ваши модификаторы доступа для свойств в модели, которую вы связываете, верны. У меня был public MyProperty { get; internal set; }
public MyProperty { get; internal set; }
public MyProperty { get; internal set; }
на некоторых, и они не будут связывать. Убрал internal
и они работали просто отлично.
Ответ 7
В моем случае я использовал соглашение MVC 4.0 для именования объекта, который вы публикуете. Например,
js: $http.post("SaveAnswer", { answer: answerValues })
С#: public ActionResult SaveAnswer([FromBody] AnswerVM answer) {...}
Когда я изменил js на $http.post("SaveAnswer", answerValues)
, все $http.post("SaveAnswer", answerValues)
.