Подтвердить что ты не робот

ASP.NET MVC: как "привязать модель" к элементу, не содержащему html-helper

Не могли бы вы рассказать мне, каким способом я могу привязать свойство model к html-элементу, созданному без использования html-помощника?

Другими словами, для простого элемента html, такого как: <input type="text" />

4b9b3361

Ответ 1

Если вы ссылаетесь на привязку к модели, для нее не требуются помощники, но соглашение об именах. Помощники просто упрощают и упрощают создание разметки HTML.

Вы можете создать простые входы HTML и правильно установить атрибут name. Соглашение об именовании по умолчанию имеет только точку, опускающее имя объекта родительского уровня, но отбирающее его оттуда.

Рассмотрим этот контроллер:

public class MyControllerController : Controller
{
     public ActionResult Submit()
     {
         return View(new MyViewModel());
     }

     [HttpPost]
     public ActionResult Submit(MyViewModel model)
     {
            // model should be not null, with properties properly initialized from form values
            return View(model);
     }
}

И эта модель:

public class MyNestedViewModel
{
    public string AnotherProperty { get; set; }
}

public class MyViewModel
{
    public MyViewModel()
    {
         Nested = new MyNestedViewModel();
    }

    public string SomeProperty { get; set; }

    public MyNestedViewModel Nested  { get; set; }
}

Вы можете создать следующую форму только в HTML:

<form method="POST" action="MyController/Submit">
    <div><label>Some property</label><input type="text" name="SomeProperty" /></div>
    <div><label>Another property</label><input type="text" name="Nested.AnotherProperty" /></div>
    <button type="submit">Submit</button>
</form>

Если вы хотите отобразить опубликованные значения (во второй перегрузке Submit), ваш HTML должен быть изменен, чтобы отобразить свойства модели. Вы разместили бы это в представлении, в данном случае используя синтаксис Razor и называемый Submit.cshtml:

@model MyViewModel
<form method="POST" action="MyController/Submit">
    <div><label>Some property</label><input type="text" name="SomeProperty" value="@Model.SomeProperty" /></div>
    <div><label>Another property</label><input type="text" name="Nested.AnotherProperty" value="@Model.Nested.SomeProperty" /></div>
    <button type="submit">Submit</button>
</form>

Итак, это можно сделать без помощников, но вы хотели бы использовать их как можно больше.

Ответ 2

Просто дайте ему имя:

<input type="text" name="foo" />

а затем внутри действия вашего контроллера просто есть аргумент с тем же именем:

public ActionResult Process(string foo)
{
    // The foo argument will contain the value entered in the 
    // corresponding input field
}