Еще одна проблема, связанная с моделью - PullRequest
1 голос
/ 22 декабря 2011

Подобный вопрос, который я задал вчера здесь с небольшой модификацией.

Вот мои модели

public class InfoModel    
{  
    public NameModel Name { get; set; }  
    public string Phone { get; set; }  
}  

public class NameModel
{
    public string Title     { get; set; }
    public string FirstName { get; set; }
    public string LastName  { get; set; }
    public List<SelectListItem> Titles 
    {
        get
        {
            var list = new List<SelectListItem>();
            list.Add(new SelectListItem() { Text = "Mr.", Value = "Mr." });
            list.Add(new SelectListItem() { Text = "Mrs.", Value = "Mrs." });
            list.Add(new SelectListItem() { Text = "Ms.", Value = "Ms." });

            return list;
        }
    }

    public NameModel()
    {

    }

    public NameModel(string first, string last) 
    {
        this.FirstName = first;
        this.LastName = last;
    }
}   

Тогда у меня есть мой первый просмотр ShowName.cshtml следующим образом

@model MyTestApp.Models.NameModel

@Html.DropDownListFor(m => m.Title, Model.Titles, Model.Titles)
<br />
@Html.LabelFor( m => m.LastName) 
@Html.TextBoxFor( m => m.LastName)       
<br />
@Html.LabelFor( m => m.FirstName) 
@Html.TextBoxFor( m => m.FirstName)       

приведенный выше вид используется в ShowInfo.cshtml, как показано ниже

@model MyTestApp.Models.InfoModel

@using (Html.BeginForm())
{
    @Html.Partial("ShowName", Model.Name)
    <br />
    @Html.LabelFor(m => m.Phone) 
    @Html.TextBoxFor(m => m.Phone)
    <br />
   <input type="submit" value="Submit Info" />
}

Когда пользователь отправляет какую-либо информацию, следующий метод контроллера называется

[HttpPost]
 public ActionResult ShowInfo(InfoModel model)
 {
    ...
 }

Проблема в том, что с телефоном все в порядке, но имя пустое. Если я изменю свой вызов @Html.Partial("ShowName", Model.Name) на @Html.EditorFor(m => m.Name, "ShowName") затем раскрывающийся список заголовков отображается в виде поля ввода

1 Ответ

2 голосов
/ 22 декабря 2011

Я бы порекомендовал вам использовать шаблоны редактора. Поэтому вместо Html.Partial используйте:

@Html.EditorFor(x => x.Name, "ShowName")

, а затем переместите частичное в ~/Views/Shared/EditorTemplates/ShowName.cshtml.

Вот причина, по которой партиал не работает: он генерирует неправильные имена для полей ввода. Поэтому, когда вы пишете:

@Html.TextBoxFor(m => m.LastName)

это генерирует следующую разметку:

<input type="text" name="LastName" id="LastName" value="" />

тогда как вам нужно:

<input type="text" name="Name.LastName" id="Name_LastName" value="" />

для связующего устройства модели по умолчанию для правильной работы и назначения свойства LastName свойства Name в модели основного представления.

Когда вы используете шаблоны редактора, как показано в моем примере, они автоматически заботятся о путях ассоциации и генерируют собственные имена для элементов ввода.

...