html.TextBoxFor и html.Textbox, значения POSTing, модель в параметрах - PullRequest
4 голосов
/ 19 ноября 2011

Хорошо, ребята, нужна помощь!

Я работаю с asp.net mvc3 бритвой (и я довольно новичок в этом, но сделал много веб-форм)

Хорошо, так что по поводу проблемы

Мой вопрос вращается вокруг представления представления.У меня очень сложная модель, основанная на моем представлении (строго типизированная).

Я хочу вернуть модель в аргументы в методе HttpPost контроллера.сделать в основном:

public ActionResult Personal()
    {
        DataModel dataModel = new DataModel();
        FormModel model = new FormModel();
        model.candidateModel = dataModel.candidateModel;
        model.lookupModel = new LookupModel();

        return View(model);
    }

    [HttpPost]
    public ActionResult Personal(FormModel formModel)
    {
        if (ModelState.IsValid)
        {
            //stuff
        }
        return View(formModel);
    }

Теперь ...
У меня проблемы с получением значений в параметре formModel в методе post.

Это работает (это означает, что я могу видеть значение), но это утомительно, так как мне нужно точно написать, где оно находится в строке, каждое поле:

@Html.TextBox("formModel.candidateModel.tblApplicant.FirstName", Model.candidateModel.tblApplicant.FirstName)

Это выглядит так:

<input name="formModel.candidateModel.tblApplicant.FirstName" id="formModel_candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>

Это не работает:

@Html.TextBoxFor(c => c.candidateModel.tblApplicant.FirstName)

Это выглядит так:

<input name="candidateModel.tblApplicant.FirstName" id="candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>

Теперь я предполагаю, что проблема заключается в несоответствии идентификатора

Поэтому, пожалуйста, ответьте мне на это:

  1. Правильно ли я делаю это
  2. Почему textboxfor не получает правильное значение / id и как мне сделатьон получает правильное значение / идентификатор, чтобы я мог получить его в POST (если это даже проблема)?
  3. Кроме того, кажется, что textboxfor является ограничительным, таким образом, что если у вас есть время даты,как вы используете метод .toshortdate ()?Это заставляет меня думать, что текстовое поле для меня бесполезно.

Быстрое разъяснение: когда я говорю, что текстовое поле не работает, оно получает значения, когда я ПОЛУЧАЮ форму.Таким образом, они заполняются, но в POST / представлении я не могу видеть их в formModel в параметрах.

Примечание еще одной стороны:
Ни один из помощников html не работает, это проблема.Они также не отображаются в состоянии модели.


Спасибо всем за помощь

Ответ:
html.TextBoxFor и html.Textbox, POSTing значения, модель в параметрах

Это была проблема, на мой взгляд, где-то, я заменил весь код с фрагментом в этом ответе, и это сработало.

Еще раз спасибо

Ответы [ 3 ]

7 голосов
/ 19 ноября 2011

Правильно ли я поступаю

Да.

Почему textboxfor не может получить правильное значение / идентификатор, и как я могу заставить его получить правильное значение / идентификатор, чтобы я мог получить его в POST (если это даже проблема)?

В вашем коде есть что-то еще, что делает это неработоспособным. Трудно сказать, так как вы не показали весь свой код. Вот полный рабочий пример, который иллюстрирует и доказывает, что с вашим кодом происходит что-то еще:

Модель:

public class FormModel
{
    public CandidateModel candidateModel { get; set; }
}

public class CandidateModel
{
    public Applicant tblApplicant { get; set; }
}

public class Applicant
{
    public string FirstName { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new FormModel
        {
            candidateModel = new CandidateModel
            {
                tblApplicant = new Applicant
                {
                    FirstName = "fn"
                }
            }
        });
    }

    [HttpPost]
    public ActionResult Index(FormModel formModel)
    {
        // the username will be correctly bound here
        return View(formModel);
    }
}

Вид:

@model FormModel
@using (Html.BeginForm())
{
    @Html.EditorFor(c => c.candidateModel.tblApplicant.FirstName)
    <button type="submit">OK</button>
}

Кроме того, кажется, что текстовое поле для является ограничительным, в смысле что если у вас есть дата и время, как вы используете .toshortdate () метод? Это заставляет меня думать, что текстовое поле для меня бесполезно.

Я согласен, что TextBoxFor является ограничительным. Вот почему я бы рекомендовал вам всегда использовать EditorFor вместо TextBoxFor. Это позволит вам просто украсить свойство модели представления с помощью атрибута [DisplayFormat] и вуаля. Вы получаете любой формат, который вам нравится.

Например:

public class MyViewModel
{
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime CreatedAt { get; set; }
}

и в представлении:

@model MyViewModel
@Html.EditorFor(x => x.CreatedAt)

отформатирует дату точно так, как вы ожидаете.

0 голосов
/ 19 ноября 2011

связыватель модели использует имя, чтобы связать значения с моделью, а также с помощниками html, например. Html.TextBoxFor использует тело лямбда-выражения для установки имени, однако вы можете сами указать имя, которое вы делаете, используя Html.TextBox( helper

@Html.TextBoxFor(x=>x.candidateModel.tblApplicant.FirstName),
                 new{@Name="formModel.candidateModel.tblApplicant.FirstName"})
0 голосов
/ 19 ноября 2011

Если ваше представление строго типизировано, попробуйте нижеприведенный помощник, вместо этого вызовите каждого помощника для каждого свойства

@Html.EditorForModel()
@Html.EditorFor(m => m.candidateModel)
@Html.EditorFor(m => m.lookupModel)

Обновление:

Итак, попытались использовать viewmodel для упрощения этой задачи.?А когда вы вернете данные, вы сможете отобразить свои реальные модели.держать ваши взгляды в чистоте даст вам меньше головной боли в будущем.Кроме того, вы можете использовать AutoMapper, чтобы помочь вам.

Вот пример, если вы думаете, что вам это поможет.http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx

...