html.TextBoxFor和html.Textbox,POSTing值,参数模型

时间:2011-11-19 12:58:00

标签: asp.net-mvc-3 post razor controller

好的伙计们,需要一些帮助!

我正在使用asp.net mvc3 razor(我相当新,但做了很多网页表单)

好的,问题

我的问题围绕提交视图。 我有一个非常复杂的模型,我的视图基于(强类型)。

我想将模型返回到控制器的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);
    }

现在...
我在post方法的formModel参数中获取值时遇到了麻烦。

这可行(意思是我可以看到这个值),但是很繁琐,因为我必须准确地写出它在每个字段的字符串中的位置:

@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"/>

现在我假设问题在于id的差异

所以请回答我:

  1. 我正确的方式
  2. 为什么textboxfor没有获得正确的值/ id,以及如何让它获得正确的值/ id以便我可以在POST中检索它(如果这甚至是问题)?
  3. 此外,似乎textboxfor是限制性的,如果你有一个日期时间,你如何使用.toshortdate()方法?这让我觉得textboxfor对我没用。

  4. 快速澄清: 当我说textboxfor无法正常工作时,我获取表格的时候会得到值。所以他们填写,但在POST /提交时,我无法在参数中的formModel中看到它们。

    另一方面注意:
    没有html帮助器工作,这是问题所在。它们也没有出现在模型状态中。


    感谢大家的帮助

    答案:
    html.TextBoxFor and html.Textbox, POSTing values, model in parameters

    在某个地方我的视图中出现问题,我在这个答案中用代码片段替换了所有代码并且它有效。

    再次感谢您

3 个答案:

答案 0 :(得分:7)

  

我是否正确地采取了这种方式

  

为什么textboxfor没有获得正确的值/ id,以及如何让它获得正确的值/ id以便我可以在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>
}
  

此外,似乎textboxfor在某种程度上是限制性的   如果你有一个日期时间,你如何使用.toshortdate()   方法?这让我觉得textboxfor对我没用。

我同意TextBoxFor是限制性的。这就是为什么我建议您始终使用EditorFor代替TextBoxFor。它允许您使用[DisplayFormat]属性和voilà简单地装饰您的视图模型属性。你得到任何你喜欢的格式。

例如:

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

并在视图中:

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

将完全按照您的预期格式化日期。

答案 1 :(得分:0)

如果您的视图是强类型的,请尝试下面的帮助程序,而不是调用每个属性上的每个帮助程序

@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

答案 2 :(得分:0)

模型绑定器使用名称将值绑定到模型,以及html助手,例如Html.TextBoxFor使用lambda表达式的主体来设置名称,但是您可以使用Html.TextBox(帮助程序自己指定您正在执行的名称

@Html.TextBoxFor(x=>x.candidateModel.tblApplicant.FirstName),
                 new{@Name="formModel.candidateModel.tblApplicant.FirstName"})