Основная модель 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).